spring项目属性注入和bean管理xml 注入一般属性和集合属性
IOC
介紹:
在Spring的應(yīng)用中,Spring IoC容器可以創(chuàng)建、裝配和配置應(yīng)用組件對(duì)象,這里的組件對(duì)象稱為Bean。
Bean的實(shí)例化
在面向?qū)ο缶幊讨?#xff0c;想使用某個(gè)對(duì)象時(shí),需要事先實(shí)例化該對(duì)象。同樣,在Spring框架中,想使用Spring容器中的Bean,也需要實(shí)例化Bean。Spring框架實(shí)例化Bean有3種方式:構(gòu)造方法實(shí)例化、靜態(tài)工廠實(shí)例化和實(shí)例工廠實(shí)例化,其中,最常用的實(shí)例方法是構(gòu)造方法實(shí)例化。
創(chuàng)建配置類
在應(yīng)用的src目錄下,創(chuàng)建config包,并在該包中創(chuàng)建配置類JavaConfig。在該配置類中使用@Bean定義3個(gè)Bean,具體代碼如下:
IOC操作bean管理(普通bean)
spring有兩種類型bean,一種普通bean,另外一種工廠bean
普通bean:在配置文件中定義的什么類型就返回什么類型,工廠bean:返回的類型可以不是定義的類型
目前創(chuàng)建項(xiàng)目后文件目錄:
導(dǎo)入的jar包五個(gè):
這次下載的是5.2.6版本,用到了四個(gè)spring的jar包,是ioc需要的至少四個(gè),直接jar包復(fù)制后新建lib文件夾,再粘貼到目錄下,再手動(dòng)添加jar包:
spring的官網(wǎng)地址:
https://repo.spring.io/release/org/springframework/spring/
common-logging-1.1.jar的下載地址:
https://mvnrepository.com/artifact/commons-logging/commons-logging/1.1
各個(gè)類中的代碼:
Emp.java:
Dept.java:
package com.company.bean;public class Dept {private String dname;public void setDname(String dname) {this.dname = dname;}@Overridepublic String toString() {return"部門是:" + dname + '\'';}public String getDname(){return dname;} }Userservice.java:
package com.company.service;import com.company.dao.UserDao; import com.company.dao.UserDaoimp;public class Userservice {//創(chuàng)建userdao類屬性private UserDao userdao;public void setUserdao(UserDao userdao) {this.userdao = userdao;}public void add(){System.out.println("servicee add..");userdao.update();}public void setUserDao(UserDaoimp userDao) {this.userdao=userDao;} }Testdemo.java:
package com.company.spring5.testdemo;import com.company.bean.Emp; import com.company.service.Userservice; import com.company.spring5.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testdemo {@Testpublic void testAdd(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Userservice userservice = context.getBean("userservice", Userservice.class);userservice.add();}@Testpublic void testbean2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Emp emp=context.getBean("emp",Emp.class);emp.testt();}@Testpublic void testbean3(){ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");Emp emp=context.getBean("emp",Emp.class);emp.testt();}}bean2.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:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"> <bean id = "userservice" class="com.company.service.Userservice"> <!-- 注入userdao對(duì)象,name屬性:類里面屬性名稱--> <!-- ref屬性:創(chuàng)建userdao對(duì)象bean標(biāo)簽的id值--><property name="UserDao" ref="userdaoimp"></property> </bean><bean id = "userdaoimp" class="com.company.dao.UserDaoimp"></bean></beans>UserDaoimp.java:
package com.company.dao;public class UserDaoimp implements UserDao{@Overridepublic void update() {System.out.println("overider update");} }內(nèi)部bean(嵌套寫法)和級(jí)聯(lián)賦值
第一種寫法。內(nèi)部bean
bean3.xml:
注入屬性–級(jí)聯(lián)賦值
<bean id="emp" class="com.company.bean.Emp"><property name="ename" value="lucy"></property><property name="dept" ref="dept"></property><property name="gender" value="女"></property> <!-- 級(jí)聯(lián)賦值:通過(guò)外部bean的方式引入,給屬性賦值--></bean><bean id="dept" class="com.company.bean.Dept"><property name="dname" value="人事部"></property></bean>結(jié)果:
級(jí)聯(lián)賦值的第二種寫法。直接在屬性中注入:
bean4.xml:
且在Emp中加上:
public Dept getDept() {return dept;}結(jié)果:
xml注入集合屬性
1.注入數(shù)組類型
2.注入list集合類型
3.注入map類型屬性
創(chuàng)建類,定義不同類型的屬性
現(xiàn)在的目錄:
Testdemo1.Java
Stu.java:
package collection;import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set;public class Stu {private String[] lesson;//屬性 課程(有多門課程)public void setLesson(String[] lesson){this.lesson=lesson;}private List<String> newlist;//list類型的屬性private Map<String,String> newmap;//Map類型的屬性private Set<String>newset;public void setNewlist(List<String> newlist) {this.newlist = newlist;//setter方法}public void setNewset(Set<String> newset) {this.newset = newset;}public void setNewmap(Map<String, String> newmap) {this.newmap = newmap;}public void ontest(){System.out.println(Arrays.toString(lesson));System.out.println(newlist);System.out.println(newmap);System.out.println(newset);} }bean1.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="stu" class="collection.Stu"><property name="lesson" ><array><value>語(yǔ)文</value><value>數(shù)學(xué)</value><value>english</value></array></property><property name="newlist"><list><value>list1</value><value>list2</value><value>list3</value></list></property><property name="newmap"><map><entry key="張三" value="第一名"></entry><entry key="李四" value="第二名"></entry><entry key="王五" value="第三名"></entry></map></property><property name="newset"><set><value>c語(yǔ)言</value><value>Java</value><value>html</value><value>css</value></set></property> </bean> </beans>結(jié)果:
IOC操作工廠bean
第一步:創(chuàng)建類,讓這個(gè)類作為工廠bean,實(shí)現(xiàn)接口factorybean
第二步:實(shí)現(xiàn)接口里面的方法,在實(shí)現(xiàn)的方法中定義返回的bean類型
先創(chuàng)建一個(gè)類:
bean2.xml進(jìn)行配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:util="http://www.springframework.org/schema/util"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="mybook" class="factorybean.Mybean"></bean> </beans>測(cè)試類:
@Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Mybean mybook = context.getBean("mybook", Mybean.class);System.out.println(mybook);}結(jié)果:
工廠bean設(shè)置返回的bean:
public class Mybean implements FactoryBean<Dept> {@Override//定義返回的beanpublic Dept getObject() throws Exception {Dept dept = new Dept();dept.setDname("財(cái)務(wù)");return dept;}測(cè)試類:
@Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Dept dept = context.getBean("mybook", Dept.class);System.out.println(dept);}注意這句話 Dept dept = context.getBean(“mybook”, Dept.class);中的"mybook"跟
<bean id="mybook" class="factorybean.Mybean"> </bean>中的id是對(duì)應(yīng)的關(guān)系,否則會(huì)報(bào)錯(cuò)。
Dept類:
bean作用域
在spring里面,默認(rèn)情況下是單實(shí)例對(duì)象
可以測(cè)試:
運(yùn)行后:
可以發(fā)現(xiàn)輸出的內(nèi)容是相同的,如果沒(méi)有tostring方法,輸出的地址是相同的,也可以證明是單實(shí)例
singleton單實(shí)例 prototype多實(shí)例
設(shè)置為多實(shí)例對(duì)象
bean生命周期
(1)通過(guò)構(gòu)造器創(chuàng)建bean實(shí)例(無(wú)參數(shù)構(gòu)造),
(2)為bean的屬性設(shè)置值和對(duì)其他bean的引用(調(diào)用set方法)
(3)調(diào)用bean的初始化方法(需要進(jìn)行配置)
(4)bean可以使用了(對(duì)象獲取到了0
(5)當(dāng)容器關(guān)閉的時(shí)候,調(diào)用bean的銷毀方法
代碼: 在bean包下創(chuàng)建類:
bean3.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="orders" class="com.company.bean.Orders" init-method="initmethod" destroy-method="destroymethod"><property name="oname" value="手機(jī)" /> </bean> </beans>測(cè)試類:
@Testpublic void test3(){ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");Orders orders = context.getBean("orders", Orders.class);System.out.println("第四步 獲取創(chuàng)建bean實(shí)例對(duì)象");System.out.println(orders);((ClassPathXmlApplicationContext)context).close();}xml自動(dòng)裝配
什么是自動(dòng)裝配:根據(jù)指定裝配規(guī)則(屬性名稱或者屬性類型),spring自動(dòng)將匹配的屬性值進(jìn)行注入
<!--實(shí)現(xiàn)自動(dòng)裝配 bean標(biāo)簽 autowire屬性 配置自動(dòng)裝配autorire屬性常用兩個(gè)值:byNane根據(jù)屬性名稱注入,注入值bean的id值和類屬性名稱一樣 bype根據(jù)屬性類型注入--><bean id= “emp" class= "com.company.bean. Emp" autowired="byType">. <!--property name=" dept" ref ="dept"></property>--></bean> <bean id ="dept"class="com.company.bean.Dept"</bean>bean管理操作有兩種方式:基于xml配置文件實(shí)現(xiàn)和基于注解方式實(shí)現(xiàn)
引入外部屬性文件:
基于注解的方式實(shí)現(xiàn)對(duì)象創(chuàng)建
第一步 引入aop依賴
第二步 開啟組件掃描
如果掃描多個(gè)包,可以多個(gè)包用逗號(hào)隔開,也可以掃描上層目錄
四個(gè)注解:
1.@Component @Component 是所有受Spring 管理組件的通用形式,@Component注解可以放在類的頭上,@Component不推薦使用。
2.@Controller @Controller對(duì)應(yīng)表現(xiàn)層的Bean,.
3.@ Service @Service對(duì)應(yīng)的是業(yè)務(wù)層Bean
4.@ Repository @Repository對(duì)應(yīng)數(shù)據(jù)訪問(wèn)層Bean ,
這四個(gè)注解功能是一樣的都能實(shí)現(xiàn)創(chuàng)建bean實(shí)例,只是在寫代碼時(shí)為了方便項(xiàng)目管理出于開發(fā)習(xí)慣才這樣區(qū)分
基于注解方式實(shí)現(xiàn)屬性注入
@Autowired:根據(jù)屬性類型進(jìn)行自動(dòng)裝配
@Qualifier:根據(jù)屬性名稱進(jìn)行注入
@Resource: 可以根據(jù)類型注入也可以根據(jù)名稱注入
@Value: 注入普通類型屬性
用Autowierd注入屬性實(shí)例:
先導(dǎo)入aop的jar包
xml文件:
dao層:
package com.company.dao;public interface UserDao {//public void add;public void update(); }package com.company.dao; import org.springframework.stereotype.Repository; @Repository public class UserDaoimp implements UserDao{@Overridepublic void update() {System.out.println("overider update");} }service層:
package com.company.service; import com.company.dao.UserDao; import com.company.dao.UserDaoimp; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository;import javax.annotation.Resource; @Repository public class Userservice {//創(chuàng)建userdao類屬性@Autowiredprivate UserDao userdao;public void add(){System.out.println("service add");userdao.update();}測(cè)試:
@Testpublic void Testservice(){ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");Userservice userservice = context.getBean("userservice",Userservice.class);System.out.println(userservice);userservice.add();}結(jié)果:
value注入實(shí)例:
再次運(yùn)行測(cè)試類結(jié)果:
AOP
Spring MVC是一款優(yōu)秀的基于MVC思想的應(yīng)用框架,它是Spring提供的一個(gè)實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的輕量級(jí)Web框架。Spring MVC框架主要由DispatcherServlet、處理器映射、控制器、視圖解析器、視圖組成,總結(jié)出Spring MVC的工作流程如下:
(1)客戶端請(qǐng)求提交到DispatcherServlet。
(2)由DispatcherServlet控制器尋找一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller。
(3)DispatcherServlet將請(qǐng)求提交到Controller。
(4)Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView。 (5)DispatcherServlet尋找一個(gè)或多個(gè)ViewResoler視圖解析器,找到ModelAndView指定的視圖。
(6)視圖負(fù)責(zé)將結(jié)果顯示到客戶端。
patcherServlet將請(qǐng)求分發(fā)給Controller之前,需要借助于Spring MVC提供的HandlerMapping定位到具體的Controller。 HandlerMapping接口負(fù)責(zé)完成客戶請(qǐng)求到Controller映射。 Controller接口將處理用戶請(qǐng)求,這和Java Servlet扮演的角色是一致的。一旦Controller處理完用戶請(qǐng)求,則返回ModelAndView對(duì)象給DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和視圖(View)。從宏觀角度考慮,DispatcherServlet是整個(gè)Web應(yīng)用的控制器;從微觀角度考慮,Controller是單個(gè)Http請(qǐng)求處理過(guò)程中的控制器,而ModelAndView是Http請(qǐng)求過(guò)程中返回的模型(Model)和視圖(View)。 ViewResolver接口(視圖解析器)在Web應(yīng)用中負(fù)責(zé)查找View對(duì)象,從而將相應(yīng)結(jié)果渲染給客戶。
基于注解的控制器
在使用Spring MVC進(jìn)行Web應(yīng)用開發(fā)時(shí),**Controller是Web應(yīng)用的核心。Controller實(shí)現(xiàn)類包含了對(duì)用戶請(qǐng)求的處理邏輯,是用戶請(qǐng)求和業(yè)務(wù)邏輯之間的“橋梁”,**是Spring MVC框架的核心部分,負(fù)責(zé)具體的業(yè)務(wù)邏輯處理。
AOP(概念)
1、什么是AOP
(1)面向切面編程(方面),利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得
業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率
(2)通俗描述:不通過(guò)修改源代碼方式,在主千功能里面添加新功能
(3)使用登錄例子說(shuō)明AOP
Controller注解類型
在Spring MVC中,使用org.springframework.stereotype.Controller注解類型聲明某類的實(shí)例是一個(gè)控制器
AOP底層使用動(dòng)態(tài)代理
第一種有接口,使用JDK動(dòng)態(tài)代理
1.使用proxy類里面的方法創(chuàng)建代理對(duì)象
第二種沒(méi)有接口,使用CGLIB動(dòng)態(tài)代理
總結(jié)
以上是生活随笔為你收集整理的spring项目属性注入和bean管理xml 注入一般属性和集合属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 笔记三 vue中封装复用 过滤器 自定义
- 下一篇: VUE双向数据绑定