zoukankan      html  css  js  c++  java
  • 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 容器执行。

  • 相关阅读:
    弹出的iframe 表单无法获取焦点
    记录IE的两则BUG
    manifest 在移动端的应用实验
    [hover 状态图片变小] 淘宝的一个小用户体验
    使用 JSONP 的几点注意
    Apple在线商店iphone5, ipad mini到货提醒 邮件
    关于弹窗中的事件多次执行
    zen coding 插件使用实践
    hadoop系列整理Spark
    hadoop系列整理HBase
  • 原文地址:https://www.cnblogs.com/tongxuping/p/7064219.html
Copyright © 2011-2022 走看看