Spring使用注解自动装配、@Autowired和@Resource比对

Annotation-based Container Configuration

使用annotation配置更加简洁,Spring都支持这两种配置风格

spring2.0引用了@Required
spring2.5采用通用的方法来驱动spring依赖注入@Autowired
2.5还添加了JSR-250注释的支持,@PostConstruct和@PreDestroy
(初始化方法)(销毁方法)

需要注册单独的Bean定义,和context命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       
    xmlns:context="http://www.springframework.org/schema/context"
       
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
                        
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
                        
                        ">

    <context:annotation-config/>

</beans>

主要是添加这三句话

@Autowired

  • 可以放在构造函数上

  • public class MovieRecommender {
    
        private final CustomerPreferenceDao customerPreferenceDao;
    
        @Autowired
        public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
            this.customerPreferenceDao = customerPreferenceDao;
        }
    
        // ...
    }
    
  • 如果目标bean仅定义在一个开头的构造函数,则不需要在这样的构造函数上使用@Autowired,但是如果有几个构造器可用,则必须注释至少一个构造器,告诉容器使用哪一个

  • 还可以放在setter方法上

  • public class SimpleMovieLister {
    
        private MovieFinder movieFinder;
    
        @Autowired
        public void setMovieFinder(MovieFinder movieFinder) {
            this.movieFinder = movieFinder;
        }
    
        // ...
    }
    
  • 可以放在方法上

  • public class MovieRecommender {
    
        private MovieCatalog movieCatalog;
    
        private CustomerPreferenceDao customerPreferenceDao;
    
        @Autowired
        public void (MovieCatalog movieCatalog,
                CustomerPreferenceDao customerPreferenceDao) {
            this.movieCatalog = movieCatalog;
            this.customerPreferenceDao = customerPreferenceDao;
        }
    
        // ...
    }
    
  • 可以应用于字段,甚至可以与构造函数混合使用

  • public class MovieRecommender {
    
        private final CustomerPreferenceDao customerPreferenceDao;
    
        @Autowired
        private MovieCatalog movieCatalog;
    
        @Autowired
        public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
            this.customerPreferenceDao = customerPreferenceDao;
        }
    
        // ...
    }
    
  • 这里使用的@Autowired注解的(member,set,constructor,method)都需要在xml中注入声明,否则在运行时找不到相匹配的(match)

  • <context:annotation-config/>
    
    <bean id="cat" class="com.haoyun.POJO.Cat"/>
    <bean id="dog" class="com.haoyun.POJO.Dog"/>
    
    <bean id="People" class="com.haoyun.POJO.People" p:name="asdfadf"/>
    
  • 需要注入声明

  • 还可以对array类型的字段和方法使用@Autowired

  • public class MovieRecommender {
    
        @Autowired
        private MovieCatalog[] movieCatalogs;
    
        // ...
    }
    
  • set集合

  • public class MovieRecommender {
    
        private Set<MovieCatalog> movieCatalogs;
    
        @Autowired
        public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
            this.movieCatalogs = movieCatalogs;
        }
    
        // ...
    }
    
  • Map

  • public class MovieRecommender {
    
        private Map<String, MovieCatalog> movieCatalogs;
    
        @Autowired
        public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
            this.movieCatalogs = movieCatalogs;
        }
    
        // ...
    }
    
  • required=false,这个对象可以为nul
  • public class SimpleMovieLister {
    
        private MovieFinder movieFinder;
    
        @Autowired(required = false)
        public void setMovieFinder(MovieFinder movieFinder) {
            this.movieFinder = movieFinder;
        }
    
        // ...
    }
    
  • 这个构造函数不传参也可以

  • 使用@Nullable也可以表示可以为null

  • public class SimpleMovieLister {
    
        @Autowired
        public void setMovieFinder(@Nullable MovieFinder movieFinder) {
            ...
        }
    }
    
  • 使用限定自动装配

  • @Qualifier("")

  • public class MovieRecommender {
    
        @Autowired
        @Qualifier("main")
        private MovieCatalog movieCatalog;
    
        // ...
    }
    
  • 算了太长

  • 完全看不完

  • 说下视频中讲解的主要内容吧

  • @Autowired如何实现

    • 先以ByType方式实现

    • 在context中寻找使用@Autowired注解使用的同类型的注解声明,

    • <bean  class="com.haoyun.POJO.Cat"/>
      
      <bean  class="com.haoyun.POJO.Dog"/>
      
      <bean id="People" class="com.haoyun.POJO.People" p:name="asdfadf"/>
      
    • 没有bean-id都没关系,先是根据type寻找

    • <bean  id="cat1" class="com.haoyun.POJO.Cat"/>
      <bean  id="cat2" class="com.haoyun.POJO.Cat"/>
      
      <bean id="dog1" class="com.haoyun.POJO.Dog"/>
      <bean id="dog2" class="com.haoyun.POJO.Dog"/>
      
      <bean id="People" class="com.haoyun.POJO.People" p:name="asdfadf"/>
      
    • 但是出现这种类型相同,就不知道怎么选了,就会报错,需要加入一个bean-id限定@Qualifier("")

    • image-20200822095308174

    • 就会引用到bean-id为dog1上的注入声明

  • @Resouce注解也有同样的用处,不过用的比较多的是@Autowired

  • Resouce是先查找byName的,不行再查找byType

  • Autowired先查找byType,再查找byName

  • @Resource注解中有很多可使用的参数

  • image-20200822095926413

  • name和type的意思应该很明了

  • image-20200822100325650

  • NoUnique不唯一

  • @Resource(type = Dog.class)
    @Resource(name = "cat1")
    
  • 总结一下:

    • @Autowired先以bytype方式查找,之后以byName方式查找
      • 可以定义在很多处位置,但是直接定义在成员上最方便
      • 可以配合@Qualifier注解进行限定
      • 内置required参数可以允许参数为null和@Nullable功能一致
      • 这个注解是spring的
    • @Resource以byName方式查找,之后以byType方式查找
      • 内置很多参数,使用方便
      • 这个注解是java的,在spring还是多用spring的注解吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值