您好,登錄后才能下訂單哦!
Spring概述
以下內容僅講解spring IOC基本使用方法
spring IOC: 依賴注入
spring AOP:管理組件對象,維護對象關系。目的:降低組件耦合度
Spring web MVC:MVC設計:架構一個MVC結構的WEB程序
Spring整合其他技術:JDBC,Mybatis,Hibernate,Struts等。
Spring IOC應用:
以注入的方式應用對象,實現組件解耦
a.管理對象:創建,初始化,釋放資源,銷毀
b.維護對象關系:采用注入方式建立對象關系 Dependency Injection(DI)依賴注入(依賴注入:set方法注入,構造器注入)
c.搭建SpringIOC開發環境:引入相關jar包;在src中添加ApplicationContext.xml
一.Spring容器—>管理組件及對象關系
1.創建ApplicationContext對象
2.向applicationContext.xml配置
3.利用ApplicationContext對象getBean()
實例化ApplicationContext容器對象—> applicationContext.xml
二.Spring創建Bean對象的控制
1.控制對象創建方式(使用范圍)
在元素中使用scope屬性控制,scope可以支持singleton和prototype,默認值是singleton。
該組件在Spring容器中只有一個bean對象,ac.getBean(“id")無論調用getBean();多少次都返回同一個對象;
scope為prototype則每次ac.getBean(“id”);返回一個新的對象。
2.指定對象初始化方法
利用元素的init-method指定,當創建bean對象后自動執行init-method方法。
<bean id="e2" class="SpringIOC.ExampleBean" scope="prototype" init-method="init"> </bean>
3.指定對象銷毀方法
利用元素的destroy-method指定。
滿足下面條件才有效:
—組件對象為單例模式
—調用AbstractApplicationContext容器對象的close()方法
4.控制單例對象創建時機
在默認情況下,單例對象是Spring容器創建時實例化;可以使用元素的lazy-init=true屬性將創建時機推遲到getBean()方法調用時。
public class ExampleBean { public ExampleBean() { System.out.println("--創建ExampleBean--"); } public void init() { System.out.println("init.."); } public void destroy() { System.out.println("destory object..."); } public void executor(){ System.out.println("調用executor方法"); } }
<bean id="e1" class="SpringIOC.ExampleBean" init-method="init" lazy-init="true" destroy-method="destroy"> </bean>
public class TestBean { public static void main(String[] args) { //創建Spring容器對象 String conf = "applicationContext.xml"; AbstractApplicationContext ac = new ClassPathXmlApplicationContext(conf); //從spring容器獲取e1,e2 ExampleBean e1 = ac.getBean("e1", ExampleBean.class); e1.executor(); ExampleBean e2 = ac.getBean("e1", ExampleBean.class); System.out.println(e1 == e2);//true ExampleBean e3 = ac.getBean("e2", ExampleBean.class); ExampleBean e4 = ac.getBean("e2", ExampleBean.class); System.out.println(e3 == e4);//false ac.close();//釋放Spring容器對象,自動調用單例的destory-method } }
IOC: Inversion of Control控制反轉
改變了對象獲取方式,之前編碼方式采用new構造方式獲取對象;IOC中采用了由容器創建對象之后注入進來使用。只要修改配置就可以改變對象關系。
三.自動裝配(自動注入)
1.自動注入(autowire)
用于指定自動注入規則。可以使用byType,byName,constructor等。用于簡化注入配置。
使用byType類型匹配注入需要注意,有2個及其以上匹配會出現異常。
2.各種類型信息的注入配置格式
a).注入字符串,數值單個數值
*b).注入bean對象
<bean id="computer" class="SpringIOC.Computer"> <!--信息set注入--> <property name="cpu" value="i 5"></property> <property name="hdd" value="索尼"></property> <property name="mainbord" value="華碩"></property> </bean> <bean id="phone" class="SpringIOC.Phone"> <!--構造器注入--> <constructor-arg index="0" value="高通"> </constructor-arg> <constructor-arg index="1" value="2G"> </constructor-arg> </bean> <bean id="student" class="SpringIOC.Student"> <!--利用set注入computer--> <property name="c" ref="computer"> </property> <!--利用set注入phone--> <property name="p" ref="phone"> </property> </bean> <bean id="student1" class="SpringIOC.Student" autowire="byType"> </bean>
c).注入集合list,set,map,properties
<!--int和list中不允許傳null值--> <bean id="msg" class="SpringIOC.MessageBean"> <property name="name"> <null/> </property> <property name="age" value="18"> </property> <property name="sex"> <null/> </property> <property name="birth" value="2017-07-17"> </property> <property name="friends"> <list> <value>tom</value> <value>jack</value> <!--<value><null/></value>--> </list> </property> <property name="cities"> <set> <value>hongkong</value> <value>shanghai</value> </set> </property> <property name="books"> <map> <entry key="1001" value="Java基礎"></entry> <entry key="1002" value="JavaWeb開發"></entry> </map> </property> <property name="db"> <props> <prop key="username">root</prop> <prop key="password">123456</prop> <prop key="driver">com.mysql.jdbc.Driver</prop> </props> </property> </bean>
d).spring表達式注入
#{表達式}
#{id名.屬性}或#{id名.key}
如果時對象屬性,需要有getXXX方法
#{List對象id[0]}
<!--定義List對象--> <util:list id="someList"> <value>小樹</value> <value>靜汪</value> </util:list> <!--定義Set集合--> <util:set id="someSet"> <value>hongkong</value> <value>shanghai</value> </util:set> <util:map id="someMap"> <entry key="10003" value="Think in Java"></entry> <entry key="10004" value="Spring"></entry> </util:map> <util:properties id="someProps"> <prop key="username">#{dbParams.user}</prop> <prop key="password">#{dbParams.password}</prop> <prop key="databases">#{dbParams.databases}</prop> </util:properties> <!--讀取db.properties形成一個Properties對象--> <util:properties id="dbParams" location="classpath:db.properties"> </util:properties> <bean id="msg1" class="SpringIOC.MessageBean"> <property name="name" value="#{dbParams['123']}"> </property> <!--<property name="name" value="#{msg.name}">--> <!--</property>--> <property name="friends" ref="someList"> </property> <property name="cities" ref="someSet"> </property> <property name="books" ref="someMap"> </property> <property name="db" ref="someProps"> </property> </bean>
db.properties:
=====
3.利用注解配置應用IOC
在JDK5.0時追加一些新特性
注解:在類定義,方法定義,成員變量定義前面使用,格式為@注解標記名。
a).組件自動掃描
可以按指定的包路徑,將包下所有組件掃描,如果發現組件類定義前有以下標記,會將組件掃面倒Soring容器。
<context:component-scan base-package="springIOC"/>
@Component //其他組件
@Controller //控制層組件
@Service //業務層組件xxxService
@Repository //數據訪問層組件xxxDao
@Named(需要引入第三方標準包)
@Scope控制對象創建,默認單例
@PostConstruct指定init-method
@PreDestroy指定destroy-method
b).注入注解
@Resource:可以在變量定義前或setXXX方法前應用
@AutoWired:可以在變量定義前或setXXX方法前應用
一般使用時,功能等價,都可以實現注入。
如果不存在多個匹配類型,使用@Resurce或@Autowired都可以。
如果存在多個匹配類型,建議按名稱注入
@Resource(name=“指定名稱”)或
@Autowired
@Qualifier(“p”)
使用建議:set注入建議用@Resource,構造器建議用@Autowired
自己編寫的組件建議使用注解配置;框架API只能用XML配置。
spring配置:
<context:component-scan base-package="springIOC"/>
代碼: @Component //掃描ExampleBean組件,默認id=exampleBean //@Scope("prototype")//等價于<bean scope=""> @Scope("singleton")//等價于<bean scope=""> public class ExampleBean { @PostConstruct //等價于<bean init-method=""> public void init(){ System.out.println("初始化邏輯"); } public void execute(){ System.out.println("---執行execute處理方法---"); } @PreDestroy //scope為singleton并釋放容器資源時,等價于<bean destroy-method=""> public void destroy(){ System.out.println("釋放資源"); } }
@Component("exam1") public class ExampleBean1 { public void execute(){ System.out.println("---執行exampleBean1的execute---"); } }
test
public class ExampleBeanTest { public static void main(String[] args) { String conf = "applicationContext.xml"; AbstractApplicationContext ac = new ClassPathXmlApplicationContext(conf); ExampleBean e1 = ac.getBean("exampleBean", ExampleBean.class); e1.execute(); ExampleBean1 e2 = ac.getBean("exam1", ExampleBean1.class); e2.execute(); ExampleBean ee = ac.getBean("exampleBean", ExampleBean.class); System.out.println(e1.toString()); System.out.println(ee.toString()); ac.close(); } }
運行結果:
---執行execute處理方法---
---執行exampleBean1的execute---
springIOC.ExampleBean@548a102f
springIOC.ExampleBean@548a102f
釋放資源
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。