spring ioc的注解 学习总结

spring ioc的注解

@Component注解

适用于工具类等非三层【dao层,service层,web层】对象的创建。
即:把对象放在spring的ioc容器中

  1. 用法如下:
/*
@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("保存成功!");
    }
}

[email protected]的延伸出的注解:
它们的用法和@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注解

[email protected] 放在属性上。
它会默认去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值。
[email protected]放在方法上。
@Autowired放在方法上,表示spring会自动执行当前方法,如果当前方法有参数,会自动到ioc容器中寻找同类型对象 给其传值。如果找到多个同类型参数,那么可以使用@Qualifier给它指定一个ioc容器中的对象id.
spring ioc的注解 学习总结

@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。