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 容器执行。

优质内容筛选与推荐>>
1、php mysql PDO使用
2、转 Python学习(十)
3、NSObject的load和initialize方法
4、【Swift初见】Swift词典
5、c++中的 extern "C"


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn