三種實例化方式:默認構造,靜態工廠,實例工廠java
配置語法:web
<bean id="" class="">
配置語法:spring
<bean id="" class="工廠全限定類名" factory-method="靜態方法">
我們來舉個栗子:
代碼:ide
public class MyBeanFactory { // 建立實例 public static UserService createService(){ return new UserServiceImpl(); } }
配置:post
<!--class 肯定靜態工廠全限定類名 factory-method 肯定靜態方法名--> <bean id="userServiceId" class="[包名].MyBeanFactory" factory-method="createService"></bean>
public class MyBeanFactory { public UserService createService(){ return new UserServiceImpl(); } }
<!-- 建立工廠實例 --> <bean id="myBeanFactoryId" class="com.itheima.c_inject.c_factory.MyBeanFactory"></bean> <!-- 得到userservice * factory-bean 肯定工廠實例 * factory-method 肯定普通方法 --> <bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>
配置信息:
<bean id="" class="" scope="">
ui
<bean id="userServiceId" class="[包名].UserServiceImpl" scope="prototype" ></bean>
如圖所示爲做用域類別與說明,Spring默認做用域爲單例,經常使用的爲單例(singleton)與多例(prototype)
this
主要介紹初始化與銷燬、後處理beanprototype
目標方法執行前或後,將進行初始化或銷燬。初始化方法經常使用於準備資源、初始化數據,銷燬方法經常使用於釋放資源等。
要求:1.容器必須close,銷燬方法執行; 2.必須是單例的代理
public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("e_lifecycle add user"); } public void myInit(){ System.out.println("初始化"); } public void myDestroy(){ System.out.println("銷燬"); } }
<bean id="userServiceId" class="com.itheima.e_lifecycle.UserServiceImpl" init-method="myInit" destroy-method="myDestroy" ></bean>
spring 提供一種機制,只要實現此接口BeanPostProcessor,並將實現類提供給spring容器,spring容器將自動執行,在初始化方法前執行before(),在初始化方法後執行after() 。 配置
public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("前方法 : " + beanName); return bean; } @Override public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { System.out.println("後方法 : " + beanName); // bean 目標對象,可生成 jdk 代理 return Proxy.newProxyInstance( MyBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("------開啓事務"); //執行目標方法 Object obj = method.invoke(bean, args); System.out.println("------提交事務"); return obj; }}); } }
配置添加:
<!-- 將後處理的實現類註冊給spring --> <bean class="[包名].MyBeanPostProcessor"></bean>
依賴注入方式分爲:手動裝配和自動裝配;
目標類:
public class User { private Integer uid; private String username; private Integer age; public User(Integer uid, String username) { super(); this.uid = uid; this.username = username; } public User(String username, Integer age) { super(); this.username = username; this.age = age; }
<!-- 構造方法注入 * <constructor-arg> 用於配置構造方法一個參數argument name :參數的名稱 value:設置普通數據 ref:引用數據,通常是另外一個bean id值 index :參數的索引號,從0開始 。若是隻有索引,匹配到了多個構造方法時,默認使用第一個。 type :肯定參數類型 --> <bean id="userId" class="com.itheima.f_xml.a_constructor.User" > <constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg> <constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg> </bean>
<bean id="personId" class="com.itheima.f_xml.b_setter.Person"> <property name="pname" value="陽志"></property> <property name="age"> <value>1234</value> </property> <property name="homeAddr" ref="homeAddrId"></property> <property name="companyAddr"> <ref bean="companyAddrId"/> </property> </bean> <bean id="homeAddrId" class="com.itheima.f_xml.b_setter.Address"> <property name="addr" value="阜南"></property> <property name="tel" value="911"></property> </bean> <bean id="companyAddrId" class="com.itheima.f_xml.b_setter.Address"> <property name="addr" value="北京八寶山"></property> <property name="tel" value="120"></property> </bean>
對「setter方法注入」進行簡化,替換
p命名空間使用前提,必須添加命名空間
public class Person { private String pname; private Integer age; private Address homeAddr; private Address componyAddr; public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Address getHomeAddr() { return homeAddr; } public void setHomeAddr(Address homeAddr) { this.homeAddr = homeAddr; } public Address getComponyAddr() { return componyAddr; } public void setComponyAddr(Address componyAddr) { this.componyAddr = componyAddr; } @Override public String toString() { return "Person [pname=" + pname + ", age=" + age + ", homeAddr=" + homeAddr + ", componyAddr=" + componyAddr + "]"; } }
public class Address { private String addr; private String tel; public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } @Override public String toString() { return "Address [addr=" + addr + ", tel=" + tel + "]"; } }
<?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="person" class="com.jdwa.spring.f_xml.c_p.Person" p:pname="zkn" p:age="22" p:componyAddr-ref="componyAddr" p:homeAddr-ref="homeAddr" /> <bean id="homeAddr" class="com.jdwa.spring.f_xml.c_p.Address" p:addr="南京" p:tel="666"/> <bean id="componyAddr" class="com.jdwa.spring.f_xml.c_p.Address" p:addr="瀋陽" p:tel="888"/> </beans>
public class CollData { private String[] arrayData; private List<String> listData; private Set<String> setData; private Map<String,String> mapData; private Properties propsData; public String[] getArrayData() { return arrayData; } public void setArrayData(String[] arrayData) { this.arrayData = arrayData; } public List<String> getListData() { return listData; } public void setListData(List<String> listData) { this.listData = listData; } public Set<String> getSetData() { return setData; } public void setSetData(Set<String> setData) { this.setData = setData; } public Map<String, String> getMapData() { return mapData; } public void setMapData(Map<String, String> mapData) { this.mapData = mapData; } public Properties getPropsData() { return propsData; } public void setPropsData(Properties propsData) { this.propsData = propsData; } @Override public String toString() { return "CollData [\narrayData=" + Arrays.toString(arrayData) + ", \nlistData=" + listData + ",\n setData=" + setData + ", \nmapData=" + mapData + ",\n propsData=" + propsData + "\n]"; } }
<?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="collData" class="com.jdwa.spring.f_xml.e_coll.CollData"> <property name="arrayData"> <array> <value>array1</value> <value>array2</value> <value>array3</value> </array> </property> <property name="listData"> <list> <value>list1</value> <value>list2</value> <value>list3</value> </list> </property> <property name="setData"> <set> <value>set1</value> <value>set2</value> <value>set3</value> </set> </property> <property name="mapData"> <map> <entry key="map-key1" value="map-val1"></entry> <entry key="map-key2" value="map-val2"></entry> <entry key="map-key3" value="map-val3"></entry> </map> </property> <property name="propsData"> <props> <prop key="prop-key1">prop-val1</prop> <prop key="prop-key2">prop-val2</prop> <prop key="prop-key3">prop-val3</prop> </props> </property> </bean> </beans>
註解使用前提,添加命名空間,讓spring掃描含有註解類
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<context:component-scan base-package="【包名】"></context:component-scan>
<?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 http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="【包名】"></context:component-scan> </beans>
你們有興趣也能夠關注個人公衆號查看文章。