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注解注入:<context:component-scan>详解(转)
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段