bean常用的配置方式有2種:
- xml文件
- 注解
使用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 name="user" class="com.chy.bean.User" /> <bean name="goods" class="com.chy.bean.Goods" /> </beans>
<beans>是根元素。一個<bean>配置一個bean:
<bean name="" class="" scope="" />
name指定bean的名稱,也可以使用id指定。如果要指定多個名稱,用逗號或分號隔開即可,比如name="grade,score"。
scope指定Bean的實例的作用域,可選,缺省時默認為singleton(單例)。
id和name的區別:
- id必須唯一,name可以重復
- id不能含有特殊字符,name可以
- id只能有一個值,name可以有多個值,逗號或分號隔開即可
Bean的作用域
| 作用域 | 說明 |
| singleton(單例) |
默認值。 該Bean(類)在Spring容器中只有一個實例,無論引用/獲取這個Bean多少次,都指向同一個對象。 singleton適用於無會話狀態的Bean(如Dao組建、Service組件)。
在spring容器啟動時就創建實例,且程序運行過程中,這個Bean只創建、使用一個實例。 由spring容器負責管理生命周期,實例的創建、銷毀均由spring容器負責。
|
| prototype(多例) |
每次獲取該Bean的實例時,都會創建一個新的實例。 在需要時(從容器中獲取該bean的時)才創建該bean的一個實例。 由spring容器負責創建實例,創建好之后交給調用者,由調用者負責后續處理,spring容器不再管理這個實例。
|
| request |
web中使用。 在一次HTTP請求中,獲取的是該Bean的同一個實例,該實例只在此次HTTP請求中有效。 新的HTTP請求,會創建新的實例。
|
| session |
web中使用。 在一次HTTP session中獲取的是該Bean的同一個實例(一個session中只創建此bean的一個實例),創建實例只在本次HTTP session中有效。 新的session,會創建新的實例
|
| globalSession | 在一個全局的HTTP session中,獲取到的是該Bean的同一個實例。 只在使用portlet上下文時有效。 |
| application | 為每個ServletContext對象創建一個實例。 只在web相關的ApplicationContext中有效。 |
| websocket | 為每個websocket對象創建一個實例。 只在web相關的ApplicationContext中有效。 |
Student student1=applicationContext.getBean("student",Student.class);
Student student2=applicationContext.getBean("student",Student.class);
如果Student的作用域是singleton,則student1、student2都指向內存中的同一個Student對象。
如果Student的作用域是prototype,則student1、student2指向不同的Student對象。
Spring加載xml配置文件的常用方式有2種
// 從類盤符加載,寫相對路徑 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml"); // 從文件系統加載,寫絕對路徑,不利於移植,一般都是用上面那種。 // ApplicationContext applicationContext=new FileSystemXmlApplicationContext("E:\\spring\\src\\spring-config.xml");
Spring的模塊化配置
spring的模塊化配置,也叫spring的模塊化開發。
- 把配置寫在一個xml文件中,xml文件會很臃腫,可以拆分為多個xml文件。
- 有時候需要多人協作,你寫一個模塊,我寫一個模塊,你那兒有一個xml配置,我這兒有一個xml配置
使用時需要同時引入多個xml配置。
有2種方式:
- 在xml種使用<import />導入其它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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <import resource="spring-config.xml" /> </beans>
- 在程序中使用多個xml配置構建spring容器
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config-controller.xml","spring-config-service.xml" );
參數個數可變。
使用注解配置Bean
使用xml進行配置,如果<bean>很多,xml文件會很臃腫。所以通常使用注解來配置bean。
使用spring的注解,需要引入spring-aop-RELEASE.jar。
spring常用的類注解:
- @Service 將業務層(Service層)的類標識為Spring容器中的Bean
- @Controller 將控制層的類標識為Spring容器中的Bean
- @Repository 將數據訪問層(Dao層)的類標識為Spring容器中的Bean
- @Component 將一個類標識為Spring容器中的Bean。
前3個是專用的,@Component是通用的,能用專用的就盡量用專用的。
這4個注解都是類注解,只能對類使用,只能寫在類上面。
使用示例:
@Component("dog") public class Dog{ public void shout(){ System.out.println("汪汪汪"); } }
小括號中寫Bean的name。
@Component public class Dog{ public void shout(){ System.out.println("汪汪汪"); } }
如果缺省name,默認為類名的camel寫法。
需要在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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.chy.bean" /> </beans>
會自動掃描指定的包,如果類上面有這4個注解中的一個,就把這個類放到Spring容器中,由Spring容器管理這個類的實例。
如果要掃描多個包,比如bean、service、dao,可以使用多個<context:component-scan />,也可以直接掃描父包com.chy。
使用spring的注解時,需要在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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> </beans>
因為包掃描<context:component-scan base-package="" />是先啟用注解,再掃描包,所以使用包掃描時不必再寫 <context:annotation-config /> 。
使用注解配置scope
@Component @Scope("prototype") public class A { //...... }
