ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自动装配

2022-03-25 17:35:41  阅读:129  来源: 互联网

标签:装配 name -- class 自动 注解 public User3


3、Bean的自动装配

  • spring自动寻找上下文,并自动装配属性

3.1spring中自动装配的三种方式

  1. 在xml中显示的配置
  2. 在java中显示的配置
  3. 隐示自动装配

3.2测试

3.2.1在xml中显示的配置

  • byName 会自动从spring上下文中的去查找,有没有和自己属性相同的class的小写的id
    <bean id="dog" class="com.mhy.atowired.Dog"/>
    <bean id="cat" class="com.mhy.atowired.Cat"/>

<!--    手动装配-->
<!--    <bean id="people" class="com.mhy.atowired.People">-->
<!--        <property name="name" value="水三丫"/>-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
<!--    </bean>-->

    <bean id="people" class="com.mhy.atowired.People" autowire="byName">
        <property name="name" value="水三丫"/>
    </bean>

注意:如果配置的id的名字不是小写的不一样不能够自动装配

例如如这里的id="dog",如果改成dog222就会装配失败

  • byType 会根据上下文配置的class类型去寻找,id名可以不是小写,没有id也可以的
    <bean id="dog222" class="com.mhy.atowired.Dog" p:dogName="小狗狗旺财"/>
    <bean id="cat222" class="com.mhy.atowired.Cat" p:catName="小苗苗HelloKitty"/>

<!--    手动装配-->
<!--    <bean id="people" class="com.mhy.atowired.People">-->
<!--        <property name="name" value="水三丫"/>-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
<!--    </bean>-->
    <bean id="people" class="com.mhy.atowired.People" autowire="byType">
        <property name="name" value="水三丫"/>
    </bean>

注意:但是不能够配置多个一样的class类型,否则会寻找失败

例如这样:

    <bean id="dog222" class="com.mhy.atowired.Dog"/>
    <bean id="cat222" class="com.mhy.atowired.Cat"/>
    <bean id="cat22" class="com.mhy.atowired.Cat"/>
    <bean id="cat2" class="com.mhy.atowired.Cat"/>

3.2.2使用注解的自动装配

jdk1.5才支持的注解,spring2.5支持的注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>
  • 注解种类

    • @Autowired :可以在set方法使用!class类的属性上使用!
        @Autowired
        private Cat cat;
    
        @Autowired
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
    • @Autowired(required = false) :表示该属性可以为null
    • @Qualifier(value="cat222") :这个注解可以显示的去定义名字,当有多个相同的class的bean的id不同配置时候可以避免精确的定位
    <bean id="cat222" class="com.mhy.atowired.Cat" p:catName="小苗苗HelloKitty"/>
    <bean id="cat22233" class="com.mhy.atowired.Cat" p:catName="小苗苗HelloKitty"/>
    
    @Autowired
    @Qualifier(value="cat222")
    private Cat cat;
    
    • @Resource(name="cat222"):是java自带的注解不是spring的注解,它也可以完成自动装配,它也可以加name属性,可以精确定位到

4、使用注解开发

使用注解开发不是使用xml必须导入spring-aop的jar包

配置环境

    <!--    扫描包-->
    <context:component-scan base-package="com.mhy.pojo2"/>
    <!--    使用注解开发-->
    <context:annotation-config/>
  • @Component(value = "user"):注解是bean的配置,这里的value相当于id,相当于

    • Component有很多衍生注解,功能相同
    • @Repository:一般用于Dao层
    • @Service:一般用于Service层
    • @Controller:一般用Web,servlet
    <bean id="user2" class="com.mhy.pojo2.User2"/>
    
  • @Value:用于属性的值,可以在属性上,也可以在set方法上

    @Value("shuisanya")
    public void setName(String name) {
        this.name = name;
    }
    @Value("shuisanya")
    private String name;
<property name="name" value="shuisanya"/>

5、完全使用java的方式配置spring

  • @Configuration:配置到自己的定义的类上面,该类就相当于applicationContext.xml的配置文件,相当于一个容器,获取context对象的方法也要变AnnotationConfigApplicationContext

  • @Bean:就你需要注册在spring的实体类对象,加在上面configuration注解的类的中作为方法返回你注册的实体类

  • @ComponentScan("com.mhy.pojo3"):扫描包

  • @Import(SyyConfig2.class):导入另一个@Configuration注解的配置容器

    @Configuration
    @ComponentScan("com.mhy.pojo3")//扫描包
    @Import(SyyConfig2.class)
    public class SsyConfig {
      @Bean
      public User3 getUser3(){
          return new User3();
      }
    

}

​```java
@Component
public class User3 {
  private String name;

  public String getName() {
      return name;
  }

  @Value("shuisanya")
  public void setName(String name) {
      this.name = name;
  }

  @Override
  public String toString() {
      return "User3{" +
              "name='" + name + '\'' +
              '}';
  }
}
@Test
public void user3Test(){
   ApplicationContext context = new AnnotationConfigApplicationContext(SsyConfig.class);

   User3 user3 = context.getBean("getUser3", User3.class);

   System.out.println(user3.getName());
}

注意:如果@Component(value = "user3") 加了value,并且加了@ComponentScan("com.mhy.pojo3")这个扫描包的注解,可以用user3来获取;当然如果在@Configuration注解的类写Bean注解用getUser3获取也是可以的

@Component(value = "user3")
public class User3 
    
@Bean
public User3 getUser3(){
    return new User3();
}

User3 user3 = context.getBean("user3", User3.class);

标签:装配,name,--,class,自动,注解,public,User3
来源: https://www.cnblogs.com/shuisanya/p/16055781.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有