Spring注解注入

Posted 大圣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring注解注入相关的知识,希望对你有一定的参考价值。

在使用注解前必须对Spring容器进行头文件导入和配置上下文环境。

 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3         xmlns:context="http://www.springframework.org/schema/context" 
 4         xmlns:util="http://www.springframework.org/schema/util"
 5         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 6         xsi:schemaLocation="http://www.springframework.org/schema/beans 
 7                             http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
 8                             http://www.springframework.org/schema/context
 9                             http://www.springframework.org/schema/context/spring-context-3.2.xsd
10                             http://www.springframework.org/schema/util
11                             http://www.springframework.org/schema/util/spring-util-3.2.xsd">
12                             
13         <!-- 开启属性注解 -->
14         <!-- <context:annotation-config /> -->
15         
16         <!-- 开启包扫描 -->
17         <context:component-scan base-package="dao,service,web"/>    
18 </beans>

 

 

属性注解原理:

  在解析到配置文件中开启了属性注解,在创建对象时发现属性存在注解,这时就会进行自动装配的操作。首先根据id去匹配,如果匹配成功则注入,若失败则根据class进行匹配,匹配成功则注入,失败则飘红(报错)。

包扫描原理:(开启了包扫描则没必要再去开启属性注解)

  在配置文件中开启了注解(属性或包扫描)标签,则Spring容器启动时解析XML配置文件会解析到包扫描的注解标签,则会扫描到包中带有注解的类时为其创建对象并将对象存入Map中,key就是首字母小写的类名,value就是创建的对象;在创建完对象后如果有属性注解则按照属性注解的方式进行注入。至此整个对象创建完成。

 

Spring注解注入分类:

  1) @Component   
  2) @Controller  
  3) @Service
  4) @Repository
  5) @Autowried
  6) @Qualifier
  7) @Resource
  8) @Value
  9) @Scope
  10) @Lazy
  11) @PostConstruct
  12) @PreDestroy

 

@Component   

? 例如
  @Component   
  public class User implements Person{}

? 或者

  @Component(value="user")
  @Component("user")  //指定id

? 说明
 @Component 是所有受Spring 管理组件的通用形式,Spring 还提供了更加细化的注解形式:@Controller(web层),@Service(service层),@Repository(Dao层);

 针对包的分层结构进行注解,不过效果一致。

 

@Controller | @Service | @Repository

? 例如
  @Controller  
  public class SoftCreateServletImpl implements ISoftCreateServlet {}

? 或者
  @Controller("softCreateServletImpl")

? 说明
 @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名称开头字母小写


@Autowired

? 例如
 @Autowired
 private ISoftPMService softPMService;

? 或者

 @Autowired(required=false)
 private ISoftPMService softPMService = new SoftPMServiceImpl();

? 说明

 @Autowired 根据bean 类型从spring 上下文中进行查找,注册类型必须唯一,否则报异常。 

与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new SoftPMServiceImpl();

@Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。

@Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。

 

@Qualifier

? 例如
 @Autowired
 @Qualifier("softService")
 private ISoftPMService softPMService;

? 说明
 使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier("beanName"),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。

  一般与Autowired一起使用;

 

@Resource

? 例如
@Resource
private DataSource dataSource; // inject the bean named ‘dataSource‘

? 或者
@Resource(name="dataSource")
@Resource(type=DataSource.class)

? 说明
@Resource 默认按bean 的name 进行查找,如果没有找到会按type 进行查找,此时与@Autowired 类似。

@Resource是由SUN公司提供,并不是Spring自带的,所以在单项目中用@Resource和用@Autowired没啥不一样,但是在聚合项目中会出现异常。

在没有为 @Resource 注解显式指定 name 属性的前提下,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。此时 name 属性不需要指定 ( 或者指定为""),否则注入失败;

 

@Value

? 例如
 @Value("20")
 private int id;


? 或者
 @Value("${id}")
 @Value("#{@list}")

? 说明

 @Value 是对Java中的基本类型和一些复杂的基本类型通过注解注入。< 八种基本类型,List,Map,Set,Properties >
 @Value("${id}") 是通过properties配置文件将id赋值。在XML配置文件添加:

<!-- 将properties配置文件加载到Spring容器中 -->
<context:property-placeholder location="classpath:/arge.properties"/>

 @Value("#{@list}") 给四种复杂的类型进行注入。需要在XML配置:

 1 <!-- 复杂的基本数据类型 -->
 2 <util:list id="list">
 3     <value>詹姆斯</value>
 4     <value>韦德</value>
 5     <value>安东尼</value>
 6     <value>保罗</value>
 7 </util:list>
 8 
 9 <util:map id="map">
10     <entry key="赛季" value="2017"></entry>
11     <entry key="战况" value="三比一翻盘夺冠"></entry>
12     <entry key="FMVP" value="詹姆斯"></entry>
13 </util:map>
14 
15 <util:set id="set">
16     <value>克利夫兰骑士</value>
17     <value>芝加哥公牛</value>
18     <value>纽约尼克斯</value>
19 </util:set>
20 
21 <util:properties id="prop">
22     <prop key="状元">西蒙斯</prop>
23     <prop key="榜眼">英格拉姆</prop>
24     <prop key="探花">布朗</prop>
25 </util:properties>

  

@Scope

? 例如
 @Scope("session")
 @Repository()
 public class UserSessionBean implementsSerializable {} 

? 说明
在使用XML 定义Bean 时,可以通过bean 的scope 属性来定义一个Bean 的作用范围,
同样可以通过@Scope 注解来完成

   @Scope中可以指定如下值:
       singleton:定义bean的范围为每个spring容器一个实例(默认值)--单例
       prototype:定义bean可以被多次实例化(使用一次就创建一次)--多例
       request:定义bean的范围是http请求(springMVC中有效)
       session:定义bean的范围是http会话(springMVC中有效)
       global-session:定义bean的范围是全局http会话(portlet中有效)

 

@Lazy

? 例如
 @Lazy()
 public class void User{} 

? 或者
 @Lazy(true)

? 说明
 在使用了@Lazy时就说明该类的懒加载生效。反之这不生效。

 

@PostConstruct | @PreDestroy

? @PostConstruct

  在方法上加上注解@PostConstruct ,这个方法就会在Bean 初始化之后被Spring 容器执 行
 (注:Bean 初始化包括,实例化Bean ,并装配Bean 的属性(依赖注入))。

? @PreDestroy

  在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。

 

































































































以上是关于Spring注解注入的主要内容,如果未能解决你的问题,请参考以下文章

Spring--IOC注解方式注入

Spring使用注解配置依赖注入

spring注解注入:<context:component-scan>详解(转)

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Spring管理Bean(XML与注解方式)