Spring注解开发6 -- @Autowired @Resource @Inject

目录

自动转配

1.@Autowired自动注入 -- spring规范

2.JSR250规范中的@Resource和JSR330规范中的@Inject   --java规范

3.@Autowired装配可以用在构造器和方法上


自动转配

1.@Autowired自动注入 -- spring规范

           当在一个组件需要使用另外一个组件时,在要用的组件上加上这个注解。

         规则:默认通过类型去IOC容器获取;如果找到了多个,将属性名称作为组件的id去容器中查找。

1.1 如下所示,默认根据UserDAO去容器中(假如容器中注册有userDAO和userDAO2两个)获取,如果找到多个就根据组件名userDAO2去找。

@Service
public class UserService {
 
    @Autowired  //这个注解有一个属性required 表示是否必须,默认是true,IOC容器中必须要有bean才行,否则抛异常,如果为false则不强制IOC容器中一个要有这个bean
    private UserDAO userDAO2;
}

1.2 如果现在这里我们需要自己决定通过组件名获取,使用@Qualifier

@Service
public class UserService {

    @Qualifier("userDAO")  //这里自己指定通过userDAO去容器中获取bean
    @Autowired
    private UserDAO userDAO2;
}

1.3 @Primary ,让Spring进行自动转配的时候,默认使用首选的bean,此时,也可以使用@qualifier的值

配置类:

扫描二维码关注公众号,回复: 3318516 查看本文章
@Configuration
public class MainConfigAutowired {

    @Primary
    @Bean("userDAO2")
    UserDAO userDAO(){
        return  new UserDAO();
    }
}

组件:

@Service
public class UserService {

    //@Qualifier("userDAO")  //不使用这个,默认就会通过Primary的方式去注入
    @Autowired
    private UserDAO userDAO;
}

2.JSR250规范中的@Resource和JSR330规范中的@Inject   --java规范

         @Resource和@Autowired一样都是可以实现自动转配,默认按照组件名称来装配的;不支持@Primary功能,以及required 属性的功能

           @Inject这个使用,需要导入依赖包javax.inject,和@Autowired功能相同,没有required=false功能

3.@Autowired装配可以用在构造器和方法上

3.1 装配在构造器 

             如果构造器只有一个有参构造器(没有其他无参或者其他构造器),这个有参构造器的@Autowired可以省略

@Service
public class UserService {

    private UserDAO userDAO;

    @Autowired
    UserService(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
}

3.2 装配在方法上 

@Service
public class UserService {

    private UserDAO userDAO;
    @Autowired
    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
}

@Bean的方法参数也是自动从容器中获取,不同手动使用@Autowired.

    @Bean
    public  User user(@Autowired Task task){ //这里的@Autowired可以省略,也是自动装配的
        return  new User();
    }

猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/82820176
今日推荐