zoukankan      html  css  js  c++  java
  • Spring注解 @Resource和@Autowired

    @Resource和@Autowired两者都是做bean的注入使用。
    其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入。但是Spring支持该注解的注入。

    共同点

    两者都可以写在字段和setter方法上。两者如果都写在字段上,就不需要写写setter方法。

    如果将@requied或者@autowired写了set方法之上,则程序会走到set方法内部。
    但如果写在了field之上,则不会进入set方法当中。

    不同点

    @Autowired


    @Autowired注解是byType按类型装配依赖对象,默认情况下它要求依赖对象必须存在
    如果允许null值,可以设置它required属性为false

    如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,抛出NoUniqueBeanDefinitionException
    如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
    @Qualifier限定描述符能进行更细粒度的控制如何选择候选者
    默认情况下(bean上没有指定@Qualifier标签)@Qualifier的value属性将匹配Bean 标识符

    @Autowired   
    private UserDao userDao;//用于字段上  
      
    @Autowired  
    public void setUserDao(UserDao userDao) {//用于属性的setter方法上  
        this.userDao = userDao;  
    }  
      
    @Autowired  
    @Qualifier("userDao")  
    private UserDao userDao;  

    @Resource

    @Resource默认byName 按照名称自动注入,由J2EE提供。
    @Resource有两个中重要的属性:name和type ,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型
    所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用 byType自动注入策略。
    如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

    @Resource(name=“userDao”)  
    private UserDao userDao;//用于字段上  
      
    @Resource(name=“userDao”)  
    public void setUserDao(UserDao userDao) {//用于属性的setter方法上  
        this.userDao= userDao;  
    }  

    @Resource装配顺序 
      (1). 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;
      (2). 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
      (3). 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
      (4). 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入。

    原文链接:

    http://my.oschina.net/u/216467/blog/205951?fromerr=dvrI1CxX

    http://blog.csdn.net/fw0124/article/details/49992067

    首先,在用注解之前,先在配置文件中加入以下配置,在base-package下自动扫描目录及子目录的注解 ,具体可以下载我的代码查看,下文有连接

    <context:component-scan base-package="com.hp.spring"></context:component-scan>

    一、@Controller 注解控制层(action)

    @Controller
    public class UserAction {
        
        @Autowired
        private UsreService usreService; 
    } 

    其中@Autowired 注入依赖,此外,@Resource和@Inject注解与@Autowired 类似

    二、@Service 注解服务层

    @Service
    public class UsreService {
        
        @Autowired
        private UserDao userDao;  
    }

    三、@Repository 持久层

    @Repository
    public class UserDao {
    } 

    四、spring4的泛型注入测试

    1 创建两个实体User和Role

    public class User {
    } 
    
    public class Role {
    } 

    2 baseDao抽取泛型基础curd

    public class BaseDao<T> {
        public void save(T entity){
            System.out.println("Save:" + entity);
        }
    }

    3 两个实现类UserDao 和 RoleDao

    @Repository
    public class RoleDao extends BaseDao<Role>{
    } 
    
    @Repository
    public class UserDao extends BaseDao<User>{
    } 

    4 baseService

    public class BaseService<T> {
        @Autowired
        private BaseDao<T> dao;//这里会自动根据实际类型传入User或Role
        
        public void addNew(T entity){
            System.out.println("addNew by " + dao);
            dao.save(entity);
        }
    }

    5 UserService 和RoleService

    @Service
    public class RoleService extends BaseService<Role>{
    } 
    
    //若注解没有指定 bean 的 id, 则类名第一个字母小写即为 bean 的 id
    @Service
    public class UserService extends BaseService<User>{
    } 

    6 测试类

        public static void main(String[] args) {
            
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");
            
            UserService userService = (UserService) ctx.getBean("userService");
            userService.addNew(new User());
            
            RoleService roleService = (RoleService) ctx.getBean("roleService");
            roleService.addNew(new Role()); 
        }  

    整个系列项目代码: http://git.oschina.net/nmc5/spring

    http://www.cnblogs.com/linhp/p/5881778.html

  • 相关阅读:
    Spring基础知识
    Hibernate基础知识
    Struts2基础知识
    在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因
    java后台获取cookie里面值得方法
    ckplayer 中的style.swf 中的 style.xml 中的修改方法
    java hql case when 的用法
    Windows下Mongodb安装及配置
    Mongodb中经常出现的错误(汇总)child process failed, exited with error number
    Mac 安装mongodb
  • 原文地址:https://www.cnblogs.com/softidea/p/5816029.html
Copyright © 2011-2022 走看看