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
    评论
第一课:面向抽象编程 4 第二课:Jdom的基本使用 4 第课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 9 一、 什么是IOC、DI 9 二、 编辑xml文件时,没有提示 9 、 注入类型(Injecting dependencies) 9 (一) setter注入类型Setter Injection 9 (二) 构造方法Constructor Injection 10 四、 id、name 11 五、 简单属性的注入 11 六、 Bean的作用范围scope 12 七、 集合注入 12 八、 自动装配autowire 13 (一) byName 13 (二) byType 14 () 注意 14 九、 生命周期 15 (一) lazy-init/default-lazy-init 15 (二) init-method destroy-method 不要和prototype一起用(了解) 15 第六课:annotation方式Spring 16 一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope、@PostConstruct、@PreDestroy 19 六、 注解对应的jar包 19 第七课:AOP(面向切面编程) 19 一、 AOP概念 19 二、 利用动态代理实现面向切面编程 20 第八课:Spring AOP配置选项 21 一、 AOP配置annotation方式 21 (一) 搭建annotation开发环境 21 (二) aspectJ类库 22 () AOP的annotation实例 22 (四) AspectJ的专业术语 23 (五) 织入点语法 23 (六) Advice 24 (七) Pointcut 26 (八) annotatin方式的AOP实例 26 二、 AOP配置xml方式 27 、 AOP实现动态代理注意 28 第九课:DataSource 28 一、 Sping配置数据源: 28 二、 注入使用 29 、 dbcp.BasicDataSource 29 第十课 Spring整合Hiberante3 30 一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的jar包 31 () 搭建日志环境并配置显示DDL语句jar包 31 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 () XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步: 首先整合Spring + Hibernate 41 、 第步:再来整合Struts2 41 四、 struts的读常量: 43 第十二课:DTO、VO 43 一、 DTO 43 二、 VO 43 第十二课:SSH整合存在的问题 43 一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 、 中文乱码问题: 44 第十课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 Spring 46

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值