@Configuration注解


@Configuration注解 與 Full模式和Lite模式

@Configuration 該注解可以聲明該類是一個配置類

當實體類之間有依賴關系時
Full模式:配置類的proxyBeanMethods的值為true時,每個@Bean方法被調用多少次返回的組件都是單實例的;
Lite模式:配置類的proxyBeanMethods的值為false時,每個@Bean方法被調用多少次返回的組件都是新創建的;

配置類組件之間有依賴關系建議用Full模式保證使用的是容器中的組件

配置類組件之間無依賴關系建議用Lite模式加速容器啟動過程,減少判斷

系統要求

Java 8+

Maven 3.6.6 +

創建Maven項目工程

引入 pom.xml 依賴
    <!--1.導入父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>

    <!--2.導入springBoot的Web場景-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
 <build>
        <!--
        SpringBoot項目默認打成jar包
            傳統web項目我們需要打成war包,放入tomcat中運行,springBoot項目我們可以導入一個插件,
            在項目打成jar包的同時,還會順帶打包運行環境,所以只要直接運行jar包也可以訪問項目
        -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
創建實體類 pojo.User 類
package com.xiang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Created by IntelliJ IDEA.
 * User: xiang
 * Date: 2021/10/12 11:04
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private String gender;
    private double money;
    
    //    添加屬性
    private  Dog dog;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", money=" + money +
                '}';
    }
}

創建實體類 pojo.Dao 類
package com.xiang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Created by IntelliJ IDEA.
 * User: xiang
 * Date: 2021/10/12 11:02
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog {
    private String name;
    private int age;
    private String gender;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

創建配置類 MyConfig 類
package com.xiang.config;

import com.xiang.pojo.Dog;
import com.xiang.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by IntelliJ IDEA.
 * User: xiang
 * Date: 2021/10/12 11:07
 */
//@Configuration//該注解表明這個類是一個配置類,效果等同於配置文件

@Configuration(proxyBeanMethods = false)

/**
 * 當實體類之間有依賴關系時
 * 	Full模式:配置類的proxyBeanMethods的值為true時,每個@Bean方法被調用多少次返回的組件都是單實例的;
 * 	Lite模式:配置類的proxyBeanMethods的值為false時,每個@Bean方法被調用多少次返回的組件都是新創建的;
 */

public class MyConfig {
    /**
     * private int id;
     * private String name;
     * private int age;
     * private String gender;
     * private double money;
     *
     * @return
     */
    @Bean
    //在spring容器中添加組件;方法名為組件的id;返回值類型為組件類型;返回值就是組件具體的實例
    public User user() {
//        return new User(1, "向向", 20, "男", 10000.00);
        return new User(1, "向向", 20, "男", 10000.00, dog());
    }

    /**
     * private String name;
     * private int age;
     * private String gender;
     *
     * @return
     */
    @Bean("dog")
    //id名也可以自定義,將id由dog改為erHa
    public Dog dog() {
        return new Dog("二哈", 2, "女");
    }
}

主程序進行測試 MainApplication 類
package com.xiang;

import com.xiang.config.MyConfig;
import com.xiang.pojo.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * Created by IntelliJ IDEA.
 * User: xiang
 * Date: 2021/10/12 11:00
 */
/*這是主程序類,類名可以隨意起,需要注意的是該類必須與其他類同包*/
@SpringBootApplication//說明這是一個springBoot應用
public class MainApplication {
    //main方法是所有程序的入口
    public static void main(String[] args) {
        //將主程序跑起來,需要調用SpringApplication類的run方法
        //參數:說明要將哪個主程序跑起來,傳入參數
        //返回值:IOC容器
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);
        //遍歷容器中的所有組件
        //getBeanDefinitionNames():返回容器中的所有組件
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println("遍歷容器中的所有組件:----->"+name);
        }

        System.out.println("/**************************************************************/");


        //獲取單個組件,獲取的實例是單例的
        User user = context.getBean("user", User.class);
        User user2 = context.getBean("user", User.class);
        System.out.println("獲取單個組件,獲取的實例是單例的:----->"+user);
        System.out.println("獲取單個組件,獲取的實例是單例的:----->"+user2);
        System.out.println("獲取單個組件,獲取的實例是單例的(user == user2):----->"+(user == user2));
        System.out.println("獲取單個組件,獲取的實例是單例的user.equals(user2):----->"+user.equals(user2));
        System.out.println("/**************************************************************/");



        //配置類本身就是一個組件,獲取的實例是單例的
        MyConfig config = context.getBean(MyConfig.class);
        System.out.println(config);
        User user1 = config.user();
        User user3 = config.user();
        System.out.println("配置類本身就是一個組件,獲取的實例是單例的:----->"+user1);
        System.out.println("配置類本身就是一個組件,獲取的實例是單例的:----->"+user3);
        System.out.println("配置類本身就是一個組件,獲取的實例是單例的(user1==user3):----->"+(user1==user3));
        System.out.println("配置類本身就是一個組件,獲取的實例是單例的(user1.equals(user3)):----->"+(user1.equals(user3)));
        
         System.out.println("/**************************************************************/");
        User user4 = context.getBean("user", User.class);
        Dog dog = context.getBean("dog", Dog.class);
        System.out.println(user4);
        System.out.println(dog);
        System.out.println("user4.getDog()==dog:----->"+(user4.getDog()==dog));
        System.out.println("user4.getDog().equals(dog):----->"+user4.getDog().equals(dog));

    }
}

運行結果
遍歷容器中的所有組件:----->org.springframework.context.annotation.internalConfigurationAnnotationProcessor
遍歷容器中的所有組件:----->org.springframework.context.annotation.internalAutowiredAnnotationProcessor
遍歷容器中的所有組件:----->org.springframework.context.annotation.internalCommonAnnotationProcessor
遍歷容器中的所有組件:----->org.springframework.context.event.internalEventListenerProcessor
遍歷容器中的所有組件:----->org.springframework.context.event.internalEventListenerFactory
遍歷容器中的所有組件:----->mainApplication
遍歷容器中的所有組件:----->org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
遍歷容器中的所有組件:----->myConfig
遍歷容器中的所有組件:----->user
遍歷容器中的所有組件:----->erHa
......
/**************************************************************/
獲取單個組件,獲取的實例是單例的:----->User{id=1, name='向向', age=20, gender='男', money=10000.0}
獲取單個組件,獲取的實例是單例的:----->User{id=1, name='向向', age=20, gender='男', money=10000.0}
獲取單個組件,獲取的實例是單例的(user == user2):----->true
獲取單個組件,獲取的實例是單例的user.equals(user2):----->true
/**************************************************************/
com.xiang.config.MyConfig$$EnhancerBySpringCGLIB$$121cfb3f@69eb86b4
配置類本身就是一個組件,獲取的實例是單例的:----->User{id=1, name='向向', age=20, gender='男', money=10000.0}
配置類本身就是一個組件,獲取的實例是單例的:----->User{id=1, name='向向', age=20, gender='男', money=10000.0}
配置類本身就是一個組件,獲取的實例是單例的(user1==user3):----->true
配置類本身就是一個組件,獲取的實例是單例的(user1.equals(user3)):----->true
/**************************************************************/
User{id=1, name='向向', age=20, gender='男', money=10000.0}
Dog{name='二哈', age=2, gender='女'}
user4.getDog()==dog:----->false
user4.getDog().equals(dog):----->true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM