Управляемая Spring аннотация @Configuration использует

Spring

Начиная с 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

Видеть«Spring @PropertySource + Environment, @PropertySource (PropertySourcesPlaceholderConfigurer) + @Value используются вместе»

5. Используйте внешние переменные

1. @PropertySource + Environment, значение в файле конфигурации свойств хранится в среде Spring с помощью аннотации @PropertySource. Интерфейс среды предоставляет метод для чтения значения в файле конфигурации. Параметр представляет собой значение ключа, определенное в свойствах файл.

2. @PropertySource (PropertySourcesPlaceholderConfigurer) + @Value

Видеть«Spring @PropertySource + Environment, @PropertySource (PropertySourcesPlaceholderConfigurer) + @Value используются вместе»