Начиная с Spring 3.0, @Configuration используется для определения классов конфигурации, которые могут заменить файлы конфигурации xml. Аннотированный класс содержит один или несколько методов, аннотированных с помощью @Bean. Эти методы будут сканироваться классом AnnotationConfigApplicationContext или AnnotationConfigWebApplicationContext и использоваться для создания bean-компонента. определения, инициализируйте контейнер Spring.
Примечание. Классы конфигурации, аннотированные с помощью @Configuration, имеют следующие требования:
- @Configuration не может быть окончательным типом;
- @Configuration не может быть анонимным классом;
- Вложенный @Configuration должен быть статическим классом.
1. @Configuation загружает методы Spring
1.1, @Configuration настроить пружину и запустить контейнер пружины
@Configuration отмечен в классе, что эквивалентно использованию класса в качестве XML-файла конфигурации Spring Функция заключается в настройке контейнера Spring (контекст приложения)
package com.cqupt.meeting.config;
import org.springframework.context.annotation.Configuration;
/**
* @Author: ranjun
* @Date: 2019/5/12 14:44
*/
@Configuration
public class TestConfig {
public TestConfig(){
System.out.println("testconfig collection init success");
}
}
эквивалентно
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd" default-lazy-init="false">
</beans>
Основной метод проверки:
package com.cqupt.meeting.config;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @Author: ranjun
* @Date: 2019/5/12 14:46
*/
public class Main {
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
// 如果加载spring-context.xml文件:
// ApplicationContext context = new
// ClassPathXmlApplicationContext("spring-context.xml");
}
}
Как видно из результатов запуска основного метода, контейнер spring запущен:
WARNING: All illegal access operations will be denied in a future release
testconfig collection init success
Process finished with exit code 0
1.2, @Configuration запускает контейнер + @Bean регистрирует компонент и управляет жизненным циклом компонента в @Bean.
@Bean помечен в методе (метод, который возвращает экземпляр), что эквивалентно тому, что в конфигурационном файле xml Spring Функция заключается в регистрации объекта bean.
класс бобов:
package com.cqupt.meeting.config;
/**
* @Author: ranjun
* @Date: 2019/5/12 14:54
*/
public class TestBean {
private String username;
private String url;
private String password;
public void sayHello() {
System.out.println("TestBean sayHello...");
}
public void start() {
System.out.println("TestBean init...");
}
public void cleanup() {
System.out.println("TestBean destroy...");
}
}
Класс конфигурации: добавить метод в класс TestConfig
// @Bean注解注册bean,同时可以指定初始化和销毁方法
// @Bean(name="testBean",initMethod="start",destroyMethod="cleanup")
//name属性相当于<bean>标签的id
@Bean
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
}
контрольная работа:
public class Main {
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
// 如果加载spring-context.xml文件:
// ApplicationContext context = new
// ClassPathXmlApplicationContext("spring-context.xml");
//获取bean
TestBean testBean = (TestBean) context.getBean("testBean");
testBean.sayHello();
}
}
结果:
testconfig collection init success
TestBean sayHello...
Process finished with exit code 0
Примечание:
(1) Аннотация @Bean относится к методу, который возвращает экземпляр.Если имя компонента не указано через @Bean, значение по умолчанию совпадает с отмеченным именем метода (первое слово в нижнем регистре);
(2) Областью действия аннотации @Bean по умолчанию является область действия синглтона, которую можно установить в область прототипа с помощью @Scope("prototype");
(3) Поскольку роль @Bean заключается в регистрации объектов bean-компонентов, для регистрации bean-компонентов можно использовать аннотации @Component, @Controller, @Service, @Ripository и др. Конечно, вам необходимо настроить аннотацию @ComponentScan для автоматического сканирования .
свойство области видимости
1).значение свойства singleton (мастер): значение по умолчанию, singleton
2) значение свойства прототипа (мастер): несколько экземпляров (область действия прототипа)
3).Значение атрибута запроса (понять): создайте объект и поместите объект в поле запроса
4).Значение атрибута сеанса (понять): создайте объект и поместите объект в поле сеанса
5).Значение атрибута globalSession (понять): создать объект и поместить объект в домен globalSession
Управляйте жизненным циклом bean-компонентов под @Bean
Жизненным циклом bean-компонентов можно управлять с помощью конфигурации на основе Java. @Bean поддерживает два атрибута, initMethod и destroyMethod, которые можно использовать для определения методов жизненного цикла. Когда bean-компонент создается или собирается быть уничтоженным, контейнер может вызвать методы жизненного цикла. Метод жизненного цикла также называется методом обратного вызова, поскольку он будет вызываться контейнером. Bean-компоненты, зарегистрированные с помощью аннотации @Bean, также поддерживают стандартные аннотации @PostConstruct и @PreDestroy, как указано в JSR-250. Если вы используете XML-методы для определения bean-компонентов, вам следует использовать bean-элементы для определения методов обратного вызова жизненного цикла. В следующем коде показано, как обратные вызовы обычно определяются с использованием элементов bean-компонента в конфигурации XML.
//@Bean注解注册bean,同时可以指定初始化和销毁方法
@Bean(name="testBean",initMethod="start",destroyMethod="cleanUp")
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
Запустите тестовый класс:
public class TestMain {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
TestBean tb = (TestBean) context.getBean("testBean");
System.out.println(tb);
TestBean tb2 = (TestBean) context.getBean("testBean");
System.out.println(tb2);
}
}
结果:
testconfig collection init success
TestBean init...
com.cqupt.meeting.config.TestBean@5852c06f
TestBean init...
com.cqupt.meeting.config.TestBean@4149c063
Process finished with exit code 0
анализировать:
1 в результате: указывает, что initMethod действует
2 в результате: указывает, что @Scope("prototype") вступает в силу
1.3, стартовый контейнер @Configuration + зарегистрированный компонент @Component
класс фасоли
package com.cqupt.meeting.config;
import org.springframework.stereotype.Component;
/**
* @Author: ranjun
* @Date: 2019/5/12 14:54
*/
//添加注册bean的注解
@Component
public class TestBean {
private String username;
private String url;
private String password;
public void sayHello() {
System.out.println("TestBean sayHello...");
}
public void start() {
System.out.println("TestBean init...");
}
public void cleanup() {
System.out.println("TestBean destroy...");
}
}
Класс конфигурации:
package com.cqupt.meeting.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
/**
* @Author: ranjun
* @Date: 2019/5/12 14:44
*/
@Configuration
//添加自动扫描注解,basePackages为TestBean包路径
@ComponentScan(basePackages = "com.cqupt.meeting.config")
public class TestConfig {
public TestConfig(){
System.out.println("testconfig collection init success");
}
// @Bean注解注册bean,同时可以指定初始化和销毁方法
// @Bean(name="testBean",initMethod="start",destroyMethod="cleanup")
//// @Bean
// @Scope("prototype")
// public TestBean testBean() {
// return new TestBean();
// }
}
Тест основного метода получает объект bean:
public class Main {
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
// 如果加载spring-context.xml文件:
// ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
//获取bean
TestBean testBean1 = (TestBean) context.getBean("testBean");
testBean1.sayHello();
}
}
结果:
testconfig collection init success
TestBean sayHello...
Process finished with exit code 0
Метод sayHello() обычно вызывается
1.4 Два способа регистрации класса AppContext с помощью AnnotationConfigApplicationContext
1.4.1 Класс конфигурации регистрируется путем передачи его конструктору AnnotationConfigApplicationContext.
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
//获取bean
TestBean tb = (TestBean) context.getBean("testBean");
tb.sayHello();
}
1.4.2 Метод регистрации AnnotationConfigApplicationContext передается в класс конфигурации для регистрации класса конфигурации.
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppContext.class)
}
1.5. Настройте веб-приложение (AnnotationConfigApplicationContext настраивается в файле web.xml)
Раньше вы обычно настраивали веб-приложение Spring с использованием контекста XmlWebApplicationContext, указав путь к внешнему файлу контекста XML в файле дескриптора веб-развертывания web.xml. XMLWebApplicationContext — это класс контекста по умолчанию, используемый веб-приложениями. Следующий код описывает элемент в файле web.xml, который указывает на внешний файл контекста XML, который будет загружен классом слушателя ContextLoaderListener.
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>sampleServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
...
</web-app>
Теперь вы измените приведенный выше код в файле web.xml, чтобы использовать класс AnnotationConfigApplicationContext. Помните, что XmlWebApplicationContext — это реализация контекста по умолчанию, которую Spring использует для веб-приложений, поэтому вам никогда не придется явно указывать этот класс контекста в файле web.xml. Теперь вы будете использовать конфигурацию на основе Java, поэтому при настройке веб-приложения вам необходимо указать класс AnnotationConfigApplicationContext в файле web.xml. Приведенный выше код будет изменен следующим образом:
<web-app>
<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>
demo.AppContext
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>sampleServlet</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>
</servlet>
...
</web-app>
Приведенный выше измененный файл web.xml теперь определяет класс контекста AnnotationConfigWebApplicationContext как часть параметра контекста и элемента сервлета. Местоположение конфигурации контекста теперь указывает на класс конфигурации AppContext. Это очень просто. В следующем разделе будет продемонстрирована реализация обратных вызовов и областей действия жизненного цикла компонента.
1.6, сводка по @конфигурации
@Конфигурация эквивалентна
@Bean эквивалентен
@ComponentScan эквивалентен
2. Объединение нескольких классов конфигурации
2.1. Добавьте xml-файл конфигурации Spring в @configuration.
package com.cqupt.meeting.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
/**
* @Author: ranjun
* @Date: 2019/5/12 20:31
*/
@Configuration
@ImportResource("classpath:configtest.xml")
public class WebConfig {
public WebConfig(){
System.out.println("WebConfig coolection init success");
}
}
TestBean2:
package com.cqupt.meeting.config;
/**
* @Author: ranjun
* @Date: 2019/5/12 20:32
*/
public class TestBean2 {
private String username;
private String url;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setUrl(String url) {
this.url = url;
}
public void setPassword(String password) {
this.password = password;
}
public void sayHello() {
System.out.println("TestBean2 sayHello..."+username);
}
public void start() {
System.out.println("TestBean2 init...");
}
public void cleanUp() {
System.out.println("TestBean2 destroy...");
}
}
configtest.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="testBean2" class="com.cqupt.meeting.config.TestBean2">
<property name="username" value="ranjun"></property>
</bean>
</beans>
Тестовый класс:
public class TestMain2 {
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(WebConfig.class);
// 如果加载spring-context.xml文件:
// ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
// 获取bean
TestBean2 tb = (TestBean2) context.getBean("testBean2");
tb.sayHello();
}
}
结果:
WebConfig coolection init success
TestBean2 sayHello...ranjun
Process finished with exit code 0
2.2. Введите другие конфигурации аннотаций в @configuration
@Configuration
@ImportResource("classpath:configtest.xml")
@Import(TestConfig.class)
public class WebConfig {
public WebConfig(){
System.out.println("WebConfig coolection init success");
}
}
TestConfig:
@Configuration
//添加自动扫描注解,basePackages为TestBean包路径
//@ComponentScan(basePackages = "com.cqupt.meeting.config")
public class TestConfig {
public TestConfig(){
System.out.println("testconfig collection init success");
}
// @Bean注解注册bean,同时可以指定初始化和销毁方法
// @Bean(name="testBean",initMethod="start",destroyMethod="cleanup")
@Bean
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
}
Тестовый класс:
public class TestMain2 {
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(WebConfig.class);
// 如果加载spring-context.xml文件:
// ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
// 获取bean
TestBean tb = (TestBean) context.getBean("testBean");
tb.sayHello();
TestBean2 tb2 = (TestBean2) context.getBean("testBean2");
tb2.sayHello();
}
}
结果:
WebConfig coolection init success
testconfig collection init success
TestBean sayHello...
TestBean2 sayHello...ranjun
Process finished with exit code 0
Вы можете видеть, что все три контейнера были успешно запущены.
2.3, вложенность @configuration (вложенная конфигурация должна быть статическим классом)
Цель объединения нескольких классов конфигурации достигается путем настройки вложенных классов конфигурации. == но обратите внимание, что внутренний класс должен быть статическим классом ==.
Над кодом:
@Configuration
//添加自动扫描注解,basePackages为TestBean包路径
//@ComponentScan(basePackages = "com.cqupt.meeting.config")
public class TestConfig {
public TestConfig(){
System.out.println("testconfig collection init success");
}
// @Bean注解注册bean,同时可以指定初始化和销毁方法
// @Bean(name="testBean",initMethod="start",destroyMethod="cleanup")
@Bean
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
@Configuration
static class InnerConfig {
@Bean
TestBean2 testBean2() {
TestBean2 testBean2 = new TestBean2();
testBean2.setUsername("ranjun");
return testBean2;
}
}
}
Тестовый класс:
public class TestMain {
public static void main(String[] args) {
// @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
// 如果加载spring-context.xml文件:
// ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
//获取bean
TestBean testBean1 = (TestBean) context.getBean("testBean");
testBean1.sayHello();
TestBean2 testBean2 = (TestBean2)context.getBean("testBean2");
testBean2.sayHello();
}
}
结果:
testconfig collection init success
TestBean sayHello...
TestBean2 sayHello...ranjun
Process finished with exit code 0
3. @EnableXXX аннотация
Используйте с @Configuration, включая @EnableAsync, @EnableScheduling, @EnableTransactionManagement, @EnableAspectJAutoProxy, @EnableWebMvc.
@EnableAspectJAutoProxy--- Spring AOP 2: 3 конфигурации аннотации @AspectJ
@EnableScheduling--«Новые возможности Spring 3.1 № 2: исходный код аннотации @Enable*, запланированная аннотация анализа исходного кода Spring для запланированных задач»
4. Настройка логической группы @Profile
5. Используйте внешние переменные
1. @PropertySource + Environment, значение в файле конфигурации свойств хранится в среде Spring с помощью аннотации @PropertySource. Интерфейс среды предоставляет метод для чтения значения в файле конфигурации. Параметр представляет собой значение ключа, определенное в свойствах файл.
2. @PropertySource (PropertySourcesPlaceholderConfigurer) + @Value