zoukankan      html  css  js  c++  java
  • Spring注释与简化配置

      在Spring 2.5及以后的版本中,提供了注释和命名空间来简化Spring的配置。下面是一些常用配置分享。


    1、@Autowired注释

      以前给一个Bean配置属性时,Bean必须配置<property name="propName" ref="beanId"/>,然后在Java文件,还必须增加属性propname的getter和setter方法。
    有了@Autowired注释后,我们可以简化配置文件和getters和setters方法。
    - 1)注释属性

    @Autowired
    private BeanClassName propName;

      当然,我们还必须告诉Spring容器,当它启动时,就去扫描所有的Bean,然后自动注入。

    <!-- 对具有@Autowired注释的Bean进行注入 -->
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

    我们也可以注释构造函数和方法。

    • 2)注释构造函数
    @Autowired
    public MainBean(PropBeanA propBeanA, PropBeanB propBeanB){
    this.propBeanA = propBeanA;
    this.PropBeanB = PropBeanB ;
    }
    • 3)注释方法
    @Autowired
    public void setPropBean(PropBean propBean) {
    this.propBean = propBean;
    }
    • 4)@Autowired的相关属性

      在默认情况下使用@Autowired注释进行自动注入时,Spring容器中匹配的候选Bean数目必须有且仅有一个。当Springp容器找不到一个匹配的Bean时(可能是没有配置该Bean或是Bean的属性名写错了),Spring容器将抛出BeanCreationException异常,并指出必须至少拥有一个匹配的Bean。

    • (1)当Bean是可选的,或是不能确定Bean一定有,可以用@Autowired(required = false),这样在找不到匹配Bean 时也不报错,该属性默认为true。
    • (2)与上面的相反,当Bean有多个时,我们可以通过@Qualifier(“beanId”)还唯一确定一个所引用的Bean,与@Autowired配合使用,它也有三种使用的地方。

    2、@Component注释

      虽然我们可以通过@Autowired在Bean类中使用自动注入功能,但是Bean还是在XML文件中通过进行定义的,通过@Component注释可以实现无需在配置文件中配置Bean的目的。

    import org.springframework.stereotype.Component;
    @Component
    public class BeanClassNameA {
    // ......
    }
    使用@Autowired
    @Component
    public class BeanClassNameB {
    @Autowired
    private BeanClassNameA propBeanA;
    
    // ......
    }

      因为没有配置,我们必须告诉Spring容器启用类扫描机制并自动注入了:

    前面的AutowiredAnnotationBeanPostProcessor可以去掉了,这行的作用后面介绍。
    - 1)@Component有个可选参数,指定Bean的名称@Component(“beanId”)
    - 2)与@Component配合使用,可以通过@Scope指定Bean的作用范围,比如:@Scope(“prototype”)

    3、其他注释

      Spring除了提供@Component注释外,还定义了几个注释:@Repository、@Service 和 @Controller。
    在目前的Spring 2.5中,这3个注释和@Component是等效的,但是从注释类的命名上,很容易看出这3个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这3个注释和@Component相比没有什么新意,但Spring将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service和 @Controller对分层中的类进行注释,而用@Component对那些比较中立的类进行注释。

    4、<context:annotation-config />

    将隐式地向Spring容器注册 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor这4个BeanPostProcessor。

    5、<context:component-scan base-package="......" />

    通过,Spring会递归扫描类注释。
    具体的说明可以参考:http://springindepth.com/book/annotation-based-bean-config-ioc-container-configuration.html

    6、JavaEE应用@Controller

    在使用SpringMVC中,可以通过@Controller简化配置

    @Controller
    @RequestMapping("/welcome.htm")
    public class SomeNameController {
    @RequestMapping(method = RequestMethod.GET)
    public void doGet(ModelMap model, WebRequest request) {
    // ...
    }
    }

    关于@Controller,在以后的文章中介绍,敬请关注。

    7、简化配置文件

    对于属性,我们一般都是通过以下配置的:

    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
    </bean>
    简化之后为:
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource" />

    使用方法介绍,我相信就没必要了,注意这两种方式可以一起使用的。

    8、命名空间

      在以上的

    <?xml version="1.0" encoding="GBK"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:osgi="http://www.springframework.org/schema/osgi" 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/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
    default-autowire="byName">

    XSD文件版本小技巧:不要增加版本(如直接使用spring-context.xsd),当然要加也是spring-context-2.5.xsd

    由于介绍内容比较多,感觉都比较空,还有一些没有介绍具体:
    - (1)JavaEE的注释,主要是@Controller;
    - (2)JPA注释,@Entity,@Table;
    - (3)JSR-250的注释,@Resource、@PostConstruct、@PreDestroy等。

    下面贴出我的Spring配置文件的内容。

    <?xml version="1.0" encoding="GBK"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:osgi="http://www.springframework.org/schema/osgi" 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/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
    default-autowire="byName">
    
    <!-- Activates annotation-based bean configuration -->
    <context:component-scan base-package="com.alipay.common" />
    
    <!-- DataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"
    value="jdbc:mysql://localhost:3306/work_shop?useUnicode=true&amp;characterEncoding=UTF-8" />
    <property name="username" value="root" />
    <property name="password" value="manager" />
    </bean>
    
    <!-- SqlMapClient -->
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocations">
    <list>
    <value>classpath:sqlmap/sqlmap-config.xml</value>
    </list>
    </property>
    </bean>
    
    <!-- SqlMapClientDAO -->
    <bean id="sqlMapClientDAO" abstract="true" p:dataSource-ref="dataSource"
    p:sqlMapClient-ref="sqlMapClient" />
    
    <!-- TransactionTemplate -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource" />
    
    <!-- TransactionManager -->
    <bean id="mockTransactionTemplate"
    class="org.springframework.transaction.support.TransactionTemplate"
    p:transactionManager-ref="transactionManager" />
    
    <!-- DAO -->
    <bean id="siteUserDAO" class="com.alipay.dal.ibatis.IbatisSiteUserDAO"
    parent="sqlMapClientDAO" />
    <!-- END OF DAO -->
    
    <!-- MANAGER -->
    <bean id="siteUserManager" class="com.alipay.biz.manager.impl.SiteUserManagerImpl" />
    <!-- END OF MANAGER -->
    <!-- FACADE-->
    <!-- END OF FACADE-->
    <!-- OSGI SERVICE-->
    <!-- END OF OSGI SERVICE-->
    </beans>
  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/itrena/p/5927137.html
Copyright © 2011-2022 走看看