Spring 講解(二 )

一、Spring 容器加載的3種方式java

public class ServiceTest {
        public static void main(String[] args) {
            //Spring容器加載有3種方式

            //第一種:ClassPathXmlApplicationContext ClassPath類路徑加載,指的就是classes路徑
            //第一種:最經常使用,spring的配置文件路徑之後就直接放在src
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

            //第二種方式:文件系統路徑得到配置文件【絕對路徑】
            //ApplicationContext context = new FileSystemXmlApplicationContext("C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml");

            //第三種方式:使用BeanFactory(瞭解)
            //String path = "C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml";
            //BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path));
            //IUserService user = (IUserService) factory.getBean("userService");
            //user.add();

            IUserService user = (IUserService) context.getBean("userService");
            user.add();
        }
    }

Spring內部建立對象的原理spring

a.解析xml文件,獲取類名,id,屬性等。

b.經過反射,用類型建立對象。 session

c.給建立的對象賦值。ide

二、BeanFactory 和 ApplicationContext對比函數

BeanFactory 採起延遲加載,第一次 getBean 時纔會初始化 Bean。

ApplicationContext 是即時加載,對 BeanFactory 擴展,提供了更多功能。測試

  • 案例演示(在第一次的代碼基礎上)this

    public class UserServiceImpl implements UserService {
    
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void add() {
            System.out.println("建立用戶...." + name);
        }
    
        public UserServiceImpl(){
            System.out.println("UserServiceImpl() 調用了");
        }
    }
    public class ServiceTest {
    
        public static void main(String[] args) {
            //1.加載beans.xml 這個spring的配置文件,內部就會建立對象
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        }
    }
    控制檯打印日誌:UserServiceImpl( ) 調用了
    public class ServiceTest {
    
        public static void main(String[] args) {
            String path = "C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml";
    BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path));
            
            // 要使調用空參構造能夠放開這段代碼便可
            // IUserService user = (IUserService) factory.getBean("userService");
        }
    }
    控制檯沒有打印日誌,說明空參構造沒有被調用。

    放開上面註釋的代碼,便可調用空參構造,控制檯打印日誌:UserServiceImpl( ) 調用了。spa

二、Spring 容器裝配 bean 的 3 種方式prototype

所謂的裝配bean就是在xml寫一個bean標籤。
<?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的三種方式,所謂的裝配bean就是在xml寫一個bean標籤-->
    
    <!-- 第一種方式: new 實現類-->
    <bean id="userService1" class="com.example.demo.service.impl.UserServiceImpl">
        <property name="name" value="zhangsan"></property>
    </bean>

    <!-- 第二種方式:經過靜態工廠方法 -->
    <bean id="userService2" class="com.example.demo.service.UserServiceFactory" factory-method="createUserService"/>

    <!--第三種方式:經過實例工廠方法 -->
    <bean id="factory2" class="com.example.demo.service.UserServiceFactory2"/>
    <bean id="userService3" factory-bean="factory2" factory-method="createUserService"/>
</beans>
測試上面哪一種 bean 裝配方式,須要註釋掉其餘 bean裝配方式。

第一種上次已經講過,如今只講第2、三種案例。日誌

public class UserServiceFactory {
    public static UserService createUserService() {
        return new UserServiceImpl();
    }
}

=========================================================================================
public class UserServiceFactory2 {
    public UserService createUserService() {
        return new UserServiceImpl();
    }
}
執行測試函數
public class ServiceTest {

    public static void main(String[] args) {

        //new 對象
        ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService1 = (UserService) context1.getBean("userService1");
        userService1.add();


        //靜態工廠
        ApplicationContext context2 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService2 = (UserService) context2.getBean("userService2");
        userService2.add();


        //實例工廠
        ApplicationContext context3 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService3 = (UserService) context3.getBean("userService3");
        userService3.add();

    }
}
感興趣的能夠本身看執行結果。三種結果都證實 bean 被 Spring 容器管理實例化了。

三、bean的做用域(掌握 singleton、prototype)

類別 說明
singleton 在Spring IoC容器中僅存在一個Bean實例,Bean以單例方式存在,默認值
prototype 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時 ,至關於執行new XxxBean()
request 每次HTTP請求都會建立一個新的Bean,該做用域僅適用於WebApplicationContext環境
session 同一個HTTP Session 共享一個Bean,不一樣Session使用不一樣Bean,僅適用於WebApplicationContext 環境
globalSession 通常用於Portlet應用環境,該做用域僅適用於WebApplicationContext 環境
案例代碼演示
bean.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="userService1" class="com.example.demo.service.impl.UserServiceImpl" scope="prototype">
    </bean>
</beans>
public class ServiceTest {

    public static void main(String[] args) {
       
        ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml");
        UserService userService1 = (UserService) context1.getBean("userService1");
        UserService userService2 = (UserService) context1.getBean("userService1");
        System.out.println(userService1);
        System.out.println(userService2);
    }
}

控制檯信息以下:

com.example.demo.service.impl.UserServiceImpl@2a556333
com.example.demo.service.impl.UserServiceImpl@7d70d1b1

若是去掉 bean.xml 文件的 scope="prototype",打印信息以下:

com.example.demo.service.impl.UserServiceImpl@7a187f14
com.example.demo.service.impl.UserServiceImpl@7a187f14

因此Spring IoC容器Bean以單例方式默認存在!!配置的話根據本身須要配置單例或者多例

相關文章
相關標籤/搜索