91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

@Bean怎么使用

發布時間:2022-08-23 14:21:48 來源:億速云 閱讀:248 作者:iii 欄目:開發技術

今天小編給大家分享一下@Bean怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    @Bean是一個方法級別上的注解,主要用在@Configuration注解的類里,也可以用在@Component注解的類里。

    目的是創建一個類。當spring需要創建指定的一個類時會調用這個注解(@Bean)的方法。

    一個對象

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Info {
        String name;
        int age;
    }

    就如同在在xml配置中添加一個類的配置。這樣spring在自動創建這個類時會調用配置的方法。

    <bean id="info" class="zhong.test.springbootdemo.usultestdemo.demo.Info">
        <property name="name" value="sjl"/>
        <property name="age" value="18"/>
    </bean>

    SprignBoot中 @Bean 完美的替換了了上面的這種在xml中配置的方法。使用以下方法就能讓spring在需要自動創建Info對象時,自動調用這個方法。

    @Configuration
    public class BeanInit {
        /**
         * 測試@Bean的作用
         */
        @Bean(name = "info")
        public Info getInfo(){
            return new Info("gfagduis", 2343);
        }
        @Bean(name = "info1")
        public Info getInfo1(){
            return new Info("gfagdufasfdfdais", 2343);
        }
    }

    獲取這個類的方法

    1、AnnotationConfigApplicationContext 類獲取

    @Component
    public class BeanTest implements CommandLineRunner {
        private void getBean(){
            ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanInit.class);
            Info info1= ctx.getBean("info",Info.class);
            System.out.println(info1);
        }
        @Override
        public void run(String... args) throws Exception {
            System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<");
            getBean();
        }
    }

    2、在spring自動創建的類中

    在構造方法中設置這個值,這樣spring就會調用該類的創建方法來獲取這個初始化的類。

    @Component
    public class BeanTest implements CommandLineRunner {
        private Info info;
        /**
         *spring創建BeanTest對象時會調用這個構造函數。參數是info1,所以會調用 @Bean(name = "info1") 注釋的方法
         *
         */
        public BeanTest (Info info1){
            this.info = info1;
        }
        
       private void getBean2(){
            System.out.println(info);
        }
        @Override
        public void run(String... args) throws Exception {
            System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<");
            getBean2();
        }
    }

    在構造函數中 BeanTest (Info info1) 參數的名稱是info1.所以就調用 @Bean(name = “info1”) 的方法來獲取初始化對象。

    結果如下:

                              >>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<
                             Info(name=gfagdufasfdfdais, age=2343)

    同時也是支持多別名配置的 例如:

        @Bean(name = { "info12", "info3", "info3" })
        public Info getInfo2(){
            return new Info("gfa4361783ais", 2343);
        }

    測試一下

    @Component
    public class BeanTest implements CommandLineRunner {
        private Info info;
        private Info info1;
        private Info info2;
        /**
         *spring創建BeanTest對象時會調用這個構造函數。參數是info1,所以會調用 @Bean(name = "info1") 注釋的方法
         *
         */
        public BeanTest (Info info1, Info info2, Info info3){
            this.info = info1;
            this.info1 = info2;
            this.info2 = info3;
        }
        
       private void getBean2(){
            System.out.println(info);
            System.out.println(info1);
            System.out.println(info2);
        }
        @Override
        public void run(String... args) throws Exception {
            System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<");
            getBean2();
        }
    }

    結果如下

    >>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<
    Info(name=gfagdufasfdfdais, age=2343)
    Info(name=gfa4361783ais, age=2343)
    Info(name=gfa4361783ais, age=2343)

    當然也可以使用 Qualifier(“xxx”) 來指定 @Bean(name = “xxx”) 中的xxx就可以調用對應的方法。

    3、使用 @Autowired 注解獲取變量

    如果有多個初始化方法,則會根據變量名稱來獲取。

    在初始化類中建立以下多個初始方法

     @Configuration
    public class BeanInit {
        /**
         * 測試@Bean的作用
         */
        @Bean/*(initMethod = "init")*/
        public Info getInfo(){
            System.out.println("進入方法");
            Info info = new Info("gfagduis", 2343);
            System.out.println("結束方法");
            return info;
        }
        @Bean(name = "info1")
        public Info getInfo1(){
            return new Info("gfagdufasfdfdais", 2343);
        }
        @Bean(name = { "info2", "info3", "info3" })
        public Info getInfo2(){
            return new Info("gfa4361783ais", 2343);
        }
        @Bean
        public Info info(){
            return new Info("gfsdfadsfad4361783ais", 23143);
        }

    然后在測試方法中分別用 @Autowired注釋Info類來獲取對應的對象

    @Component
    public class BeanTest implements CommandLineRunner {
        //private Info info;
        @Autowired
        private Info getInfo;
        @Autowired
        private Info info1;
        @Autowired
        private Info info3;
        @Autowired
        private Info info;
        /*public BeanTest (Info info){
            this.info = info;
        }*/
        private void getBean(){
            /*ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanInit.class);
            Info person = ctx.getBean("info",Info.class);
            System.out.println(person);*/
            System.out.println(getInfo);
            System.out.println(info1);
            System.out.println(info3);
            System.out.println(info);
        }
        @Override
        public void run(String... args) throws Exception {
            System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<");
            getBean();
        }
    }

    測試結果如下:

    >>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<
    Info(name=gfagduis, age=2343)
    Info(name=gfagdufasfdfdais, age=2343)
    Info(name=gfa4361783ais, age=2343)
    Info(name=gfsdfadsfad4361783ais, age=23143)

    在使用 @Autowired 注解時,也可以與 @Qualifier(“xxx”) 指定使用哪個方法來獲取對象。

    @Bean 注解的屬性解析

    value 和 name

    name 和 value 兩個屬性是相同的含義的, 在代碼中定義了別名。 為 bean 起一個名字,如果默認沒有寫該屬性,那么就使用方法的名稱為該 bean 的名稱

    autowire

    裝配方式 有三個選項

    • Autowire.NO (默認設置)

    • Autowire.BY_NAME

    • Autowire.BY_TYPE

    指定 bean 的裝配方式, 根據名稱 和 根據類型 裝配, 一般不設置,采用默認即可。

    initMethod

    bean 的初始化方法, 直接指定方法名稱即可,不用帶括號。初始方法要在對應的POHO中,也就是Info類中。

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Info {
        String name;
        int age;
        private void init(){
            System.out.println("進入方法2");
            name = "fhasjdf";
            age = 12;
        }
    }
    @Configuration
    public class BeanInit {
        /**
         * 測試@Bean的作用
         */
        @Bean(name = "info", initMethod = "init")
        public Info getInfo(){
            System.out.println("進入方法");
            Info info = new Info("gfagduis", 2343);
            System.out.println("結束方法");
            return info;
        }

    最終結果、:

    進入方法
    結束方法
    進入方法2
    2019-09-24 14:57:11.917  INFO 11656 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
    2019-09-24 14:57:12.048  INFO 11656 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
    2019-09-24 14:57:12.051  INFO 11656 --- [           main] z.t.s.u.start.UsulTestStartApplication   : Started UsulTestStartApplication in 1.74 seconds (JVM running for 2.246)
    >>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<
    Info(name=fhasjdf, age=12)

    所以最終調用的是init()方法來創建類。

    destroyMethod

    bean 的銷毀方法, 在調用 IoC 容器的 close() 方法時,會執行到該屬性指定的方法。不過,只是單實例的 bean 才會調用該方法,如果是多實例的情況下,不會調用該方法。

    注意:

    由于spring構造的對象都是單例的,所以只要是從spring ioc中獲取的對象都是同一個,他們中的屬性,即便是私有的非靜態屬性。都是公用的。

    public class MyDisposableBean implements DisposableBean {
        public Map<String, String> map = new HashMap<>();
        int i = 0;
        private void init(){
            System.out.println("MyDisposableBean自定義初始化方法");
        }
        private void destroyMethod(){
            System.out.println("自定義銷毀方法,MyDisposableBean對象銷毀");
        }
        public void pringt(){
            System.out.println("-------------------------------");
            System.out.println("i=" + i);
            System.out.println("map.size=" + map.size());
            map.entrySet().stream().forEach(item -> System.out.println("map ->   "+ item.getKey() + "---" + item.getValue()));
        }
    }
    @Configuration
    public class BeanConfigurer {
        @Bean(name = "MyDisposableBean", initMethod = "init", destroyMethod = "destroyMethod")
        public MyDisposableBean getMyDisposableBean(){
            System.out.println("MyDisposableBean構造方法");
            return new MyDisposableBean();
        }
    }
    @Component
    public class DisposableBeanTest implements CommandLineRunner {
        @Override
        public void run(String... args) throws Exception {
            MyDisposableBean myDisposableBean = new MyDisposableBean();
            MyDisposableBean myDisposableBean1 = new MyDisposableBean();
            MyDisposableBean myDisposableBean2 = SpringContextUtils.getBean(MyDisposableBean.class);
            myDisposableBean2.pringt();
            myDisposableBean2.map.put("1", "2");
            myDisposableBean2.i = 2;
            MyDisposableBean myDisposableBean3 = SpringContextUtils.getBean(MyDisposableBean.class);
            myDisposableBean3.pringt();
            myDisposableBean1.pringt();
        }
    }

    測試結果:

    MyDisposableBean構造方法
    MyDisposableBean自定義初始化方法
    -------------------------------
    i=0
    map.size=0
    -------------------------------
    i=0
    map.size=0
    -------------------------------
    i=2
    map.size=1
    map ->   1---2
    -------------------------------
    i=0
    map.size=0

    可以看出,如果是我們自己在程序中new的對象(myDisposableBean 和 myDisposableBean1),其私有屬性map和i是不變的。不相互影響。

    另外兩從spring ioc中獲取的對象(myDisposableBean2 和 myDisposableBean3 )的map和i兩個屬性,是公用的。其中一個對象修改值,name另外一個對象的屬性也相應的變化

    以上就是“@Bean怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    宜良县| 巴青县| 瑞金市| 广平县| 虹口区| 仁布县| 新田县| 白沙| 米易县| 大同县| 麻城市| 北川| 抚顺市| 垦利县| 大关县| 法库县| 四平市| 安化县| 茌平县| 九龙坡区| 林周县| 波密县| 靖远县| 台南县| 江源县| 彩票| 聂拉木县| 光泽县| 修水县| 双鸭山市| 容城县| 徐水县| 临沂市| 汝南县| 安平县| 阜康市| 沧源| 乌拉特后旗| 汾阳市| 榆树市| 桃源县|