spring中IOC容器注冊和獲取bean的實例


spring中常用的功能主要的是ioc和aop,此處主要說明下,實例注冊和使用的方法,此為學習后的筆記記錄總結

1.使用xml文件配置

在idea中創建maven工程,然后創建實例Person,然后在配置文件中配置bean,具體代碼如下所示:,

public class Person {
    private String name;
    private Integer age;

    public Person(){
        super();
    }

    public Person(String name,Integer age){
        super();
        this.name=name;
        this.age=age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
<?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="user" class="com.enjoy.cap1.Person">
        <property name="name" value="zhangsan"/>
        <property name="age" value="23"/>
    </bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 類說明
 *
 * @Date: 2019/5/1 14:54
 * @Version: 1.0
 */
public class MainTest1 {
    public static void main(String []args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        Person person= (Person) ac.getBean("user");
        System.out.println(person);
    }
}

以上是使用xml文件配置實現的bean的注冊和使用,運行結果如下所示:

 

----------------------------------------------------------------------------
2.下面使用注解的方式進行bean的注冊與使用
首先需要一個配置文件,本例使用MainConfig.java,實例同上Persion,測試文件MainTest.java文件
代碼如下所示:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 類說明
 *
 * @Date: 2019/5/1 14:56
 * @Version: 1.0
 */
@Configuration
public class MainConfig {


    @Bean
    public Person person(){
        return new Person("lisi",20);
    }
}
 
        
public class MainTest2 {
    public static void main(String []args){
        ApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
        Person person= (Person) app.getBean("person");
        System.out.println(person);
    }
}

運行結果如下所示:

 

 針對以上情況的特殊說明:
1)在獲取bean的實例時,xml配置文件中給出class指定類的全路徑名,id指定Bena的名稱,是通過反射創建對象(Person)的實例,
創建時需要有構造器,否則會在運行時提示bean構造報錯;或者使用默認的構造器,或者自己創建帶參的構造器,在注入的時候設置構造器參數,
對象的創建是有spring容器來創建和管理,而不是對象本身,通過依賴注入完成對象的依賴關系。
2)使用注解方式實現bean的注冊時,可以通過構造器的名字進行改寫,或者通過bean標簽指定bean的名字,而不是固定的實體類的構造器名字,
一般默認情況是構造器的名字。注解可以使用掃描配置或者import等標簽配置使用其他標簽

若是不想直接改方法的名字,可以在@Bean標簽后面直接指定bean的名字,如下截圖所示:

測試時使用注解中的測試類即可。此處不再進行測試說明。

3)以上是bean的注冊使用說明,但若是類特別多,則配置起來就會特別繁瑣,增加工作量,此時就可以通過掃描標簽幫助注冊bean實例,

      代碼說明如下所示;

    

@Configuration
@ComponentScan(value = "com.enjoy.cap2")
public class MainConfig {
}

測試類的代碼如下所示:

public class Test02 {

    @Test
    public void test(){
        AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
        String [] names=app.getBeanDefinitionNames();
        for (String name:names){
            System.out.println(name);
        }
    }
}

實體類不變,程序的運行結果如下所示;

 

 4)在spring的容器中注冊bean時默認是單例的,因為在整個容器中,通過id獲取的時候,id值是唯一的,在容器啟動時就創建並放到容器中(容器是一個map對象)

可以在配置文件中通過標簽進行配置,在bean配置處,增加@Scope(“prototype”) ,可以實現多例,配置文件修改的代碼如下所示:

測試類不變,在運行后會得出false的執行結果。

5)雖然spring容器中bean的注冊默認是單例的,但可以通過標簽@Lazy來指定獲取對象時在進行bean實例的創建,而不是在容器啟動時創建bean實例

      不配置懶加載標簽時,程序代碼及運行結果如下所示;

package com.enjoy.cap4.config;

import com.enjoy.cap1.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 類說明
 *
 * @Date: 2019/5/1 16:16
 * @Version: 1.0
 */
@Configuration
public class MainConfig {

    @Bean
    public Person person(){
        System.out.println("在容器中添加Person類的bean實例");
        return new Person("zhangsan",11);
    }
}
public class Test04 {
    public static void main(String []args){
        AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("IOC容器創建完成........");
        app.getBean("person");
    }
}

程序的運行結果為;

 

若在配置文件中的bean實例上添加Lazy標簽,代碼如下所示:

 


免責聲明!

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



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