一、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以單例方式默認存在!!配置的話根據本身須要配置單例或者多例