spring 实现基本 xml 配置注解化

2016-06-15 15:48:54   最后更新: 2016-11-11 11:11:44   访问数量:539




上一篇日志中,我们介绍了使用注解代替传统的 xml 进行依赖注入编程:

Spring 3.0 依赖注入的注解实现

然而,我们还是必须要提供 ApplicationContext.xml 来进行整个项目的初始化

本篇日志中,我们介绍一下如何将一切 xml 配置全部用 java 代码配合相应的注解完成

 

Spring 框架是控制反转 (IOC) 或依赖性注入 (DI) 模式的推动因素,而这种推动是通过基于容器的配置实现的。过去,Spring 允许开发人员使用基于 XML 的配置,通过利用应用程序上下文 XML 文件来管理 bean 依赖性

尽管使用 XML 配置较为简单和便捷,但仍有另外一种方法可定义 bean 及其依赖项。这种方法也称为基于 Java 的配置。不同于 XML,基于 Java 的配置使您能够以编程方式管理 bean。这可通过运用多种注释来实现

 

在实际中,我们一般会使用一个 xml 来定义 bean,用来描述程序上下文:

<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: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/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="classpath:config.properties" name="propertiesBean"/> <bean id="course" class="demo.Course"> <property name="module" ref="module"/> </bean> <bean id="module" class="demo.Module"> <property name="assignment" ref="assignment"/> </bean> <bean id="assignment" class="demo.Assignment" /> </beans>

 

 

我们可以通过使用 java 代码与 @Configuration 和 @Bean 注解实现相同的功能:

@PropertySource("classpath:propertyFile.properties") public class AppPropertiesContext { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } } @Configuration @ComponentScan("com.techlog.test") public class AppContext { @Bean public Course course() { Course course = new Course(); course.setModule(module()); return course; } @Bean public Module module() { Module module = new Module(); module.setAssignment(assignment()); return module; } @Bean public Assignment assignment() { return new Assignment(); } }

 

 

@Configuration 注释位于类的顶端。它告知 Spring 容器这个类是一个拥有 bean 定义和依赖项的配置类。@Bean 注释用于定义 bean

上述注释位于实例化 bean 并设置依赖项的方法上方

方法名称与 bean id 或默认名称相同

方法的返回类型是向 Spring 应用程序上下文注册的 bean

可使用 bean 的 setter 方法来设置依赖项,容器将调用它们来连接相关项

基于 Java 的配置也被视为基于注解的配置

 

@ComponentScan 则用来开启 Spring 注解,他有一个 basePackages 属性,用来指定基础包,如果没有提供该参数,Spring 会以该类所在包作为基础包,可以通过 @ComponentScan("com.techlog.test") 或 @ComponentScan(basePackages = "com.techlog.test") 指定基础包,你也可以为这个参数指定多个基础包

更推荐的方式是通过 basePackageClasses 参数指定包中包含的类或接口:

@Configuration @ComponentScan(basePackageClasses = {CDPlayer.class, DVDPlayer.class}) public class CDPlayerConfig { ... }

 

 

@ComponentScan 注解相当于 xml 配置的:

<context:component-scan base-package="com.techlog.test"/>

 

 

@Import 用来引入另一个配置类

@Configuration @Import(CDConfig.class) public class CDPlayerConfig { ... }

 

 

@ImportResource 则用来引入另一个配置 xml 文件

@Configuration @ImportResource("classpath:cd-config.xml") public class CDPlayerConfig { ... }

 

 

传统上,IOC 容器慧聪 webapp/web.xml 进入加载整个项目:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>

 

 

Spring MVC 提供了 WebApplicationInitializer 接口,用于替代 web.xml 配置文件

实现这个接口的类会在 Servlet 容器启动时自动加载并运行,这样就可以代替 web.xml 的行为

public class MyWebAppInitializer implements WebApplicationInitializer { /** * Servlet容器启动时会自动运行该方法 */ @Override public void onStartup(ServletContext servletContext) throws ServletException { servletContext.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml"); ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcher", new DispatcherServlet()); registration.setLoadOnStartup(1); registration.addMapping("/"); registration.setInitParameter("contextConfigLocation", "classpath:dispatcher-servlet.xml"); servletContext.addListener(new ContextLoaderListener()); } }

 

 

@Bean 支持两种属性,即 initMethod 和 destroyMethod,可用于定义生命周期方法

在实例化 bean 或即将销毁它时,容器便可调用生命周期回调方法

 

@Configuration public class AppContext { @Bean(initMethod = "setup", destroyMethod = "cleanup") public Course course() { Course course = new Course(); course.setModule(module()); return course; } @Bean(initMethod = "setup", destroyMethod = "cleanup") public Module module() { Module module = new Module(); module.setAssignment(assignment()); return module; } ... } public class Course { private Module module; private String name; public Course() { } public void setup() { this.name = "M100 Pythagoras Theorems" } public void setModule(Module module) { this.module = module; } public void cleanup() { module = null; } }

 

@Bean 注释现在有两个额外的属性,即 initMethod 和 destroyMethod,它们定义了生命周期方法的设置和清除

这些方法是在已经注册的 bean 中实现的,最终由容器在 bean 初始化及其销毁之前调用它

这里以 Course bean 为例,提供了生命周期方法实现。所实现的方法是 setup 和 cleanup。同样,您还可以在 Module 和 Assignment bean 中实现这些方法

 

@Configuration public class AppContext { @Bean(initMethod = "setup", destroyMethod = "cleanup") @Scope("prototype") public Course course() { Course course = new Course(); course.setModule(module()); return course; } ... }

 

上面的 AppContext 配置类使用 @Scope 注释为 Course bean 定义了一个 prototype 范围。默认范围是 singleton

 

详解 Spring 3.0 基于 Annotation 的依赖注入实现 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-iocannt/

使用 Java 配置进行 Spring bean 管理 https://www.ibm.com/developerworks/cn/webservices/ws-springjava/

Spring 3.0 Reference Documentation http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/?cm_mc_uid=28330255546614387512535&cm_mc_sid_50200000=1447220650

Servlet 3 + Spring MVC零配置:去除所有xml http://blog.csdn.net/xiao__gui/article/details/46803193

《spring 实战(第三版)》第三章

 






技术帖      xml      config      配置      龙潭书斋      java      spring      注解      annotation      configuration     


京ICP备15018585号