学习视频来源于B站-尚硅谷Java视频教程_Spring注解驱动开发视频教程
1.@Autowired @Qualifier @Primary的使用案列
- @Autowired使用注意事项
1)优先按照类型去IOC容器中寻找对应的组件, 类似于@Autowired private AdminDao adminDao;
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注解规范
- @Resource: 默认按照组件名称进行装配
与@Autowired有一样的自动装配功能:@Resource private AdminDao adminDao;
但是不支持:
1).不支持@Primary
2 ).也不支持@Autowired(reqiured=false)- @Inject: 需要导入javax.inject的包
和@Autowired的功能一样
但是不支持:
1).支持@Primary
2)不支持reqiured=false属性
@Inject private AdminDao adminDao;
3.关于@Autowired、@Inject、@Resource三者区别
-------------参考了第三方博客
又到了总结的时间 :
@Autowired | @Resource(JSR250) | @Inject(JSR330) | |
---|---|---|---|
来 源 | Spring | Java | Java |
默认装配方式 | 按照组件类型 | 按照组件名称 | 按照组件类型 |
是否支持按组件名称装配 | 是 (@Autowired和@Qualifier一起使用) | 是 | 是 (@Inject和@Name一起使用) |
是否支持 @Primary | 支持 | 不支持 | 支持 |
是否支持 required=false | 支持 | 不支持 | 不支持 |
作用范围 | 变量、setter方法、构造函数 | 变量、setter | 变量、setter方法、构造函数 |
@Autowired 的一些默认规则
- [标注在方法位置]@Bean标注的方法在创建对象时, 方法参数的值从他容器中获取
- [标注在构造器上]如果组件中只有一个有参构造器,这个有参构造器的@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的作用
- BeanNameAware 获得到容器中Bean的名称
- BeanFactoryAware 获得当前bean Factory,从而调用容器的服务
- ApplicationContextAware 获得当前的application context从而调用容器的服务
- MessageSourceAware 得到message source从而得到文本信息
- ApplicationEventPublisherAware 应用时间发布器,用于发布事件
- 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();