spring ioc的注解
@Component注解
适用于工具类等非三层【dao层,service层,web层】对象的创建。
即:把对象放在spring的ioc容器中
- 用法如下:
/*
@Component注解 相当于 bean标签中的class="全限定类名",其默认id是当前类 类名首字母小写,也可以通过@Component注解的value属性去指定id。
比如:@Component("userDao") 相当于
<bean id = "userDao" class="cn.lzy.dao.impl.UserDaoImpl" />
*/
@Component("userDao")
public class UserDaoImpl2 implements UserDao {
public void save() {
System.out.println("保存成功!");
}
}
2.@Component的延伸出的注解:
它们的用法和@Component注解一样。
@Repository :用来创建dao层对象
@Service :用来创建servcie层对象
@Controller :用来创建controller层对象
(ps : 目前spring没有明确规定这四个注解必须在指定的位置使用,所以混合使用也可以。但一般不这样做,按照规范使用)
@Scope注解
主要用于 改变Bean对象作用域。
@Scope 里面的值(默认是单例singleton)可以是singleton , prototype , request ,response , global session
常用的值:singleton , prototype
singleton:代表单例
prototype : 代表多例
用法示例如下:
@Repository
@Scope("prototype")//代表使用多例
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("保存成功!");
}
@PostConstruct
public void init(){
System.out.println("对象被创建了");
}
@PreDestroy
public void destroy(){
System.out.println("对象被销毁了");
}
}
生命周期的注解
@PostConstruct 相当于bean标签的init-method属性
@PreDestroy 相当于 bean标签的destroy-method 属性
用法在上面的代码块中。
下面的代码用来测试生命周期 和容器 和单例、多例的关系
public class UserTest {
@Test
public void saveTest(){
//1.获取ioc容器
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.从ioc容器中调用方法
UserService userService = ac.getBean(UserService.class);
userService.save();
//3.容器关闭
ac.close();
}
}
生命周期 和容器 和单例、多例的关系
总结:
(1)Bean对象的作用域是singleton时,
容器创建,对象产生;
容器在,对象在;
容器销毁,对象销毁。
(2)Bean对象的作用域是prototype时,
容器创建,对象未产生,只有调用方法时,才会产生对象;
对象一直存在;
直到垃圾回收器 回收它,对象销毁。
DI中编写的类 和 框架的类 注解注入的问题
在自己编写的类中,类中的属性,可以直接赋值。因为它们是java提供的,不需要进行解耦合;
而框架中的类,都是一些字节码,我们无法使用注解注入,因为注解必须和java代码放在一起才会生效。
总结:spring注解实现DI ,只能注入自己编写的对象。
@Autowired注解
1.@Autowired 放在属性上。
它会默认去ioc容器中寻找与当前属性类型 一样的对象,
如果找到了唯一一个,就赋值给当前属性;
如果找到多个,那么在同类型的对象中,根据当前属性的名称去匹配Bean对象的id。
重点:@Qualifier注解 配合@Autowired 放在属性上使用时,可以先按照属性名称去匹配 bean对象的id (ps:@Qualifier可以指定寻找对象的id)
例如:
@Service
public class UesrServiceImpl implements UserService {
@Autowired(required = false)
@Qualifier("userDaoImpl")
private UserDao userDao;
}
此外@Autowired 还可以在里面加上required = false属性 和值
用来在容器中没找到对象,会给当前属性赋值为null。如果不加,直接报错而已。(required属性默认true)
总结:@Autowired注解默认情况下根据类型【by type】去ioc容器中寻找对象。如果没有找到,再根据对象id【by name】去找。根据对象id 寻找有两种匹配方式,分别是根据属性名或者 根据@Qualifier注解中的value值。
2.@Autowired放在方法上。
@Autowired放在方法上,表示spring会自动执行当前方法,如果当前方法有参数,会自动到ioc容器中寻找同类型对象 给其传值。如果找到多个同类型参数,那么可以使用@Qualifier给它指定一个ioc容器中的对象id.
@Resource注解说明【重点】
@Resource只能放在属性上,默认会先根据当前属性名去IOC容器中匹配对象id【by name】,如果没有匹配到会按照类型【by type】去匹配。
如果@Resource添加一个name属性,就表示必须安装name属性的值去IOC容器中匹配对象id【by name】。
总结@AutoWired和@Resource的区别
@Autowired是默认先by type 再by name。此注解是spring提供的。
@Resource是默认先by name 再by type。此注解是java提供的。
一般使用@Autowired。