Spring注解学习笔记(三) -- 自动装配

学习视频来源于B站-尚硅谷Java视频教程_Spring注解驱动开发视频教程

1.@Autowired @Qualifier @Primary的使用案列

  1. @Autowired使用注意事项
       @Autowired
       private AdminDao adminDao;
      1)优先按照类型去IOC容器中寻找对应的组件, 类似于
    AdminDao adminDao=ApplicationContext.getBean(AdminDao.class);

    如果找到对应的bean, 就会赋值给adminDao
    2)如果找到多个相同类型的组件, 再按照属性的名称作ID, 再去IOC容器中查找
    3)还可以使用@Qualifier("adminDao")明确指定自动装配的组件id
    4)自动装配默认是将属性赋值好, 如果没有的会抛出NoSuchBeanDefinitionException,
                        
    也可以在@Autowired注解中添加 属性 required = false

        @Autowired(required = false)

    5)@Primary 首选自动装配对象, 与@Qualifier("adminDao")明确指定冲突
             @primary 的使用示例

        @Primary
        @Bean("adminDao2")
        public AdminDao adminDao(){
    
            AdminDao adminDao=new AdminDao();
            adminDao.setAnInt(2);
            return adminDao;
        }

     

1).建立com.itcast.Dao.AdminDao.class

@Repository
public class AdminDao {

    private int anInt = 1;
    
    public int getAnInt() {
        return anInt;
    }

    public void setAnInt(int anInt) {
        this.anInt = anInt;
    }

    public String save(){
        return "adminDao...";
    }
}

2).建立com.itcast.Service.AdminService.class
@Qualifier("adminDao")用来指定自动装配的组件id

@Service
public class AdminService {

    @Qualifier("adminDao")
    @Autowired
    private AdminDao adminDao2;

    public void save(){
        System.out.println("adminService..."+adminDao2.getAnInt());
        System.out.println(adminDao2.save());
    }
}

3).建立com.itcast.Config.MainConfigOfAutoWired.class

加入包扫描@ComponentScan({"com.itcast.Service","com.itcast.Dao"})

@Configuration
@ComponentScan({"com.itcast.Service","com.itcast.Dao"})
public class MainConfigOfAutoWired {

    @Bean("adminDao2")
    public AdminDao adminDao(){

        AdminDao adminDao=new AdminDao();
        adminDao.setAnInt(2);
        return new AdminDao();
    }
}

4).建立一个测试类

 @Test
 public void test02() {
        AnnotationConfigApplicationContext ApplicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutoWired.class);

        System.out.println("容器创建完成....");

        AdminService adminService = ApplicationContext.getBean(AdminService.class);
        System.out.println(adminService);
        adminService.save();

        ApplicationContext.close();
    }

5).输出结果:自动注入成功

补充一下:            @Autowired另外两种在setter方法构造函数上的使用

            如果组件中只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以从IOC容器中获取

    private AdminDao adminDao;
    private UseDao useDao;

//     在构造方法上的使用    
    @Autowired
    public AdminService(UseDao useDao) {
        this.useDao = useDao;
    }


/**
  *    在构造器的参数上的使用
  * public AdminService(@Autowired UseDao useDao) {
  *     this.useDao = useDao;
  * }
  *
  */


//     在setter方法上的使用
    @Autowired
    public void setAdminDao(AdminDao adminDao) {
        this.adminDao = adminDao;
    }


/**
  *    在setter方法的参数上的使用
  * public void setAdminDao(@Autowired AdminDao adminDao) {
  *     this.adminDao = adminDao;
  * }
  *
  */



//优先按照类型去IOC容器中寻找对应的组件, 如果找到对应的bean, 就会调用相应的方法赋值给属性
  

 

2.Spring 还支持@Resource(JSR250) 和 @Inject(JSR330) - - Java注解规范

 

  1. @Resource:       默认按照组件名称进行装配  
                          与@Autowired有一样的自动装配功能:
        @Resource
        private AdminDao adminDao;

       但是不支持:
                     1).不支持@Primary
                     2 ).也不支持@Autowired(reqiured=false)
  2. @Inject: 需要导入javax.inject的包
                  和@Autowired的功能一样
       但是不支持:
                    1).支持@Primary
                    2)不支持reqiured=false属性
     
       @Inject
       private AdminDao adminDao;

3.关于@Autowired、@Inject、@Resource三者区别

                                                                                                                                                    -------------参考了第三方博客

又到了总结的时间 :

 @Autowired@Resource(JSR250)@Inject(JSR330)
             来     源SpringJavaJava
       默认装配方式按照组件类型按照组件名称按照组件类型
是否支持按组件名称装配

(@Autowired和@Qualifier一起使用)

(@Inject和@Name一起使用)

是否支持 @Primary支持不支持支持
是否支持 required=false支持不支持不支持
           作用范围变量、setter方法、构造函数变量、setter变量、setter方法、构造函数

@Autowired 的一些默认规则

  1. [标注在方法位置]@Bean标注的方法在创建对象时, 方法参数的值从他容器中获取
  2. [标注在构造器上]如果组件中只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以从IOC容器中获取

4)自定义容器使用Spring容器底层的组件                                     

                                                                                                            --  Aware接口

 

 1).那么Aware接口是用来做什么的? 

实现了Aware接口Spring的底层的组件自动注入自定义的Bean

                                                                                        转载于https://blog.csdn.net/iechenyb/article/details/83788338

1.1)Aware接口的注解

原文:
    Marker superinterface indicating that a bean is eligible to be notified by the Spring container of a particular framework object through a callback-style method. Actual method signature is determined by individual subinterfaces, but should typically consist of just one void-returning method that accepts a single argument.

百度直译:

        标记超接口,指示bean有资格通过回调样式方法由特定框架对象的spring容器通知。实际的方法签名由单个子接口确定,但通常只应包含一个接受单个参数的void返回方法。

1.2)spring aware的使用:

       使用了spring Aware 你的bean将会和spring框架耦合,spring aware 的目的是为了让bean获取spring容器的服务:

1.3)常见Aware的作用

  1. BeanNameAware                                    获得到容器中Bean的名称
  2. BeanFactoryAware                                 获得当前bean Factory,从而调用容器的服务
  3. ApplicationContextAware                       获得当前的application context从而调用容器的服务
  4. MessageSourceAware                           得到message source从而得到文本信息
  5. ApplicationEventPublisherAware            应用时间发布器,用于发布事件
  6. ResourceLoaderAware                           获取资源加载器,可以获得外部资源文件

     

 5.关于@Profile标签

                             Spring中的@Profile标签可以根据当前环境, 动态的激活和切换一系列组件的功能

1.@Profile 用法

              String[] value();  默认为: default, 可接受String类型的数组  

2.功能:

             1).指定组件在那个环境中可以被加载到IOC容器中,

                              1.1不指定, 任何环境都能注册这个组件

                              1.2指定了环境标识, 只有当环境激活时才能注册到IOC容器中

             2).具体的使用:

                             2.1可以标注在配置类的组件上的

    @Profile("test")
    @Bean("TestDataSource")
    public DB TestDataSource(@Value("${db.pass}") String pass){
        DB db = new DB();
        db.setName(name);
        db.setPass(pass);
        db.setClassDirver(ClassDirver);
        db.setDBUrl("jdbc:mysql://127.0.0.1:3306/test");
        return db;
    }

                              2.2可以标注在配置类的上

   @Profile("profile")
   @PropertySource("classpath:/dbconfig.properties")
   @Configuration
   public class MainConfigProfile implements EmbeddedValueResolverAware {

3.环境的切换:

                                   3.1 使用虚拟机参数切换:    -Dspring.profiles=test

                                   3.2 使用无参的applicationContext, 设置激活的环境

//        1.创建无参的AnnotationApplicationContext对象
        AnnotationConfigApplicationContext ApplicationContext = new           
                                                      AnnotationConfigApplicationContext();
//        2.设置激活的环境
        ApplicationContext.getEnvironment().setActiveProfiles("test");
//        3.注册主配置类
        ApplicationContext.register(MainConfigProfile.class);
//        4.启动刷新容器
        ApplicationContext.refresh();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值