18.2 @Configuration
@Configuration是标注在Class上的,当我们需要基于Java类的形式对Spring进行配置时,我们就需要在对应的配置类上使用@Configuration进行标注,这样Spring才会把对应的Class当做是一个配置用的Class。使用@Configuration进行标注的配置类默认也会被Spring作为一个bean进行注册。所以当我们的拥有多个@Configuration进行标注的配置类时,如果需要进行依赖注入时对应的依赖项处于不同的@Configuration配置类时也可以通过注入@Configuration配置类,然后通过注入的@Configuration配置类实例的对应方法产生目标依赖bean的实例进行注入。如下示例中我们拥有两个Java配置类,其中ServiceConfig中的UserService需要注入一个在DaoConfig中定义的UserDao,然后我们就在ServiceConfig中注入了一个DaoConfig,再通过调用DaoConfig的userDao()方法获取对应的UserDao实例注入给UserService的实例。
@Configuration
public class ServiceConfig {
@Autowired
private DaoConfig daoConfig;
@Bean
public UserService userService() {
UserService userService = new UserServiceImpl(daoConfig.userDao());
return userService;
}
}
@Configuration
public class DaoConfig {
@Bean
public UserDao userDao() {
UserDao userDao = new UserDaoImpl();
return userDao;
}
}
18.2.1 扫描类路径以注册bean
基于Java类的Spring配置也可以像基于XML配置一样让Spring扫描类路径以将标注了@Component等注解的Class注册为bean容器中的bean定义。这是通过在配置上使用@ComponentScan进行标注来进行定义的。
@Configuration
@ComponentScan(basePackages="com.app")
public class SpringConfig {
}
在上述代码中我们就通过@ComponentScan定义了将扫描类路径下com.app包及其子孙包下所有标注了@Component等注解的Class,并将它们作为一个bean定义注册到当前的bean容器中。其就相当于如下XML定义。
<context:component-scan base-package="com.app"/>
通过@ComponentScan的includeFilters和excludeFilters属性可以指定在扫描时需要使用的过滤器,对应的过滤器是通过@Filter进行指定的,可以通过其type属性指定过滤器的类型,默认为ANNOTATION。如下示例表示将排除@Service注解。
@Configuration
@ComponentScan(basePackages = "com.app", excludeFilters={@Filter(Service.class)})
public class ControllerConfig {
}
基本上使用<context:component-scan/>
能定义的内容,@ComponentScan都有与之相对应的属性进行定义,更多信息请参考Spring API文档中ComponentScan的相关信息。
18.3 实例化bean容器
18.3.1 非Web环境
对于非Web环境的bean容器实例化,Spring为我们提供了一个对应的ApplicationContext实现类——AnnotationConfigApplicationContext。实例化AnnotationConfigApplicationContext时我们可以直接将Java配置类作为构造参数传入。
public static void main(String args[]) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
context.close();
}
当有多个Java配置类时,我们可以给AnnotationConfigApplicationContext传递多个Java配置类。
public static void main(String args[]) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
SpringConfig.class, ServiceConfig.class, DaoConfig.class);
context.close();
}
我们还可以先构造一个空的AnnotationConfigApplicationContext,然后通过对应的register()方法来注册用于配置的Java类。
public static void main(String args[]) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(SpringConfig.class);//注册单个配置类
context.register(ServiceConfig.class, DaoConfig.class);//注册多个配置类
context.refresh();//注册完后一定要refresh()一次
context.close();
}
此外,需要注意的是AnnotationConfigApplicationContext不仅仅接收使用@Configuration进行标注的类作为配置类,其还可以接收使用@Component等用于标注为bean的注解进行标注的类作为配置类。所以,当我们直接使用AnnotationConfigApplicationContext时,我们可以选择在对应的配置类上使用@Configuration进行标注,也可以选择使用@Component等定义bean的注解进行标注。
关于AnnotationConfigApplicationContext的更多信息请参考Spring API文档。
18.3.2 Web环境
对于Web环境而言,Spring针对基于Java类配置提供了一个对应WebApplicationContext的实现类—AnnotationConfigWebApplicationContext。如果需要使用该WebApplicationContext,我们需要通过在web.xml文件中通过<context-param/>
或<init-param/>
进行指定。
我们知道通常在Web环境下使用Spring时我们都需要在web.xml文件中定义如下Listener,Spring将通过该Listener来实例化WebApplicationContext,默认会实例化一个基于XML配置的XmlWebApplicationContext。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果我们希望ContextLoaderListener实例化的WebApplicationContext是一个AnnotationConfigWebApplicationContext,那么我们可以通过在web.xml中定义如下参数,该参数将会被ContextLoaderListener用来实例化对应的WebApplicationContext实现类。
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
我们知道基于XML配置的ContextLoaderListener默认取WEB-INF目录下的applicationContext.xml文件作为对应的配置文件,且对应的配置我们可以通过参数contextConfigLocation进行配置。那么当我们使用的WebApplicationContext是AnnotationConfigWebApplicationContext时对应的contextConfigLocation也需要变更为我们的Java配置类,且必须是全名的,即包含对应的包名称,多个配置类之间以逗号或分号或空格隔开。所以对于使用Spring的Web应用,我们应该如下定义对应的ContextLoaderListener。在如下示例中我们就通过contextClass参数指定了对应的contextClass为AnnotationConfigWebApplicationContext,然后通过contextConfigLocation参数指定了三个Java配置类。
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.app.SpringConfig,com. app.ServiceConfig,com.app.DaoConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
而对于使用SpringMVC而言,如果我们是使用基于Java类的配置来配置对应的SpringMVC定义,则需要在定义DispatcherServlet时通过来定义需要使用的contextClass和contextConfigLocation。如下示例中我们就指定了SpringMVC将使用AnnotationConfigWebApplicationContext作为contextClass,对应的Java配置类为com.app.ControllerConfig。
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.app.ControllerConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
18.3.3 测试环境
对于使用Spring Test进行单元测试而言,我们可以直接通过@ContextConfiguration的classes属性来指定需要使用的Java配置类。如下示例中我们就指定了将使用SpringConfig、ServiceConfig和DaoConfig三个Java配置类来构建对应的ApplicationContext。
@ContextConfiguration(classes={SpringConfig.class, ServiceConfig.class, DaoConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ConfigurationTest {
@Autowired
private ApplicationContext context;
@Test
public void test() {
context.getBean("hello", Hello.class);
}
}
相关推荐
传统的XML配置方式是通过`<bean>`标签在XML文件中定义Bean的属性和依赖关系,而基于Java的配置则是通过编写Java类来完成相同的工作。 **基于Java的配置**(Java-based configuration)引入于Spring 3.0,它的主要...
我们可以创建一个配置类,然后在其中声明bean,使用`@ComponentScan`扫描包含普通类的包,这样Spring就能自动管理普通类。同时,也可以在配置类中使用`@Bean`注解创建bean实例,然后在普通类中通过`@Autowired`注入...
举例来说,使用ClassPathXmlApplicationContext可以从classpath的XML配置文件中读取应用程序上下文,从而初始化Spring IoC容器,并加载应用程序中定义的所有bean。而FileSystemXmlApplicationContext则从文件系统中...
这里,`beans.xml`是配置文件,用于定义bean。 六、使用BeanFactory 获取并使用bean的主要方法有`getBean(String beanName)`,如: ```java MyService myService = (MyService) factory.getBean("myService"); ``` ...
Spring-beans模块负责Bean的定义,类的实例化,以及依赖关系的处理;Spring-context模块提供了访问应用程序对象的上下文,它是一个配置文件,用于配置应用程序中的对象,它还集成了Spring AOP的功能;Spring-context...
7. **Webservice调用**:在定义的Job类中,使用Java的Web服务客户端库(如JAX-WS的`javax.xml.ws.Service`)来调用Web服务。你需要提供服务的WSDL地址,生成服务代理类,并通过代理类的方法发起请求。 8. **异常...
在IT领域,Spring框架是Java开发中的核心组件,尤其在企业级应用中广泛使用。Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者在不修改源代码的情况下,通过“切面”来关注程序的某些方面,...
当我们在一个切面类中使用`@DeclareParents`时,Spring会为匹配到的bean创建代理,并将指定的接口实现注入到这些bean中。 首先,我们需要了解`@Aspect`的使用。在Spring Boot项目中,创建一个带有`@Aspect`注解的类...
1. **事件(Event)**:在Spring中,事件通常是一个简单的Java类,继承自`java.util.EventObject`。这个类通常包含事件相关的数据,但也可以只是一个空的标记类,用于标识发生了某种类型的事件。例如,我们可以定义...
在本篇【框架源码篇 04】中,我们将深入探讨Spring框架的核心概念——Bean定义配置化。Spring是Java领域最广泛使用的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称...
在Spring配置文件中,我们需要定义一个工厂bean,然后指定该工厂bean的`factory-bean`属性,以及工厂bean中用于创建目标bean的方法,即`factory-method`属性。下面是一个简单的例子: ```xml <bean id="myFactory...
它支持XML、Java注解和基于Java的配置等多种方式来定义Bean。ApplicationContext通过实现BeanFactory接口,不仅能够初始化和管理Bean,还能够处理事件、国际化的消息、资源加载等。 1. **配置加载**: ...
MyBatis可以使用简单的XML或注解来进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 三、Spring框架简介 Spring框架是用于构建企业级Java应用程序的...
Spring框架是Java开发中的核心组件,它为构建企业级应用提供了全面的解决方案。Spring以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)而闻名,它简化了Java EE应用...
除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...
这些素材可能会讲解如何配置Spring容器,如何编写Bean定义,如何使用注解进行编程,或者如何实现AOP切面,甚至可能涉及到Spring与其他技术的集成,比如数据库连接、RESTful服务等。 在Spring框架中,依赖注入是核心...
《精通Spring--Java轻量级架构开发实践》是关于Spring框架的一本深入实践的书籍,主要探讨了如何在Java环境中高效地使用Spring进行轻量级应用程序开发。书中的第四章和第十章尤其重要,涵盖了Spring的核心概念和技术...
2. **spring-beans.jar**:这个jar提供了bean的定义、创建和管理,以及IoC/DI的核心实现。它是所有Spring应用的基础,无论应用大小,都需要这个jar。 3. **spring-aop.jar**:AOP(面向切面编程)是Spring的一个...