網(wǎng)站在正在建設(shè)中品牌營(yíng)銷(xiāo)策劃怎么寫(xiě)
文章目錄
- 1. IOC容器概念
- 2. IOC底層原理
- 3. IOC(接口)
- 4. IOC操作Bean管理(概念)
- 5. IOC操作Bean管理(基于xml方式)
- 5.1 基于xml創(chuàng)建對(duì)象
- 5.2 基于xml方式注入屬性
- 5.2.1 DI:依賴(lài)注入,就是注入屬性
- 5.2.2 xml注入其他類(lèi)型屬性
- 5.2.3 注入屬性-外部bean
- 5.2.4 注入屬性-內(nèi)部bean(很多人喜歡用外部bean,結(jié)構(gòu)明顯)
- 5.2.5 注入屬性-級(jí)聯(lián)賦值
- 5.2.6 xml注入集合屬性(數(shù)組、List、Map、Set)
- 6. IOC操作Bean管理(FactoryBean)
- 7、IOC操作Bean管理(bean作用域)
- 8. IOCBean管理(bean生命周期)
- 9. IOC操作Bean管理(xml自動(dòng)裝配)
- 10. IOC操作Bean管理(外部屬性文件)
- 11. IOC操作Bean管理(基于注解方式:簡(jiǎn)化xml配置)
- 12. 基于注解方式實(shí)現(xiàn)屬性注入
- 13. 完全注解開(kāi)發(fā)
1. IOC容器概念
- 控制反轉(zhuǎn),把對(duì)象創(chuàng)建和對(duì)象之間的調(diào)用過(guò)程,交給Spring進(jìn)行管理。
- 使用IOC目的:為了耦合度降低
2. IOC底層原理
- XML解析、工廠設(shè)計(jì)模式、反射
- IOC過(guò)程
- 第一步:xml配置文件,配置創(chuàng)建的對(duì)象
<bean id="dao" class="com.zsh.UserDao"></bean>
- 第二步:有service類(lèi)和dao類(lèi),創(chuàng)建工廠類(lèi)
class UserFactory{public static UserDao getDao(){//1.xml解析 String classValue = class屬性值; //2.通過(guò)反射創(chuàng)建對(duì)象Class clazz = Class.forName(classValue);return (UserDao)clazz.getDeclaredConstructor().newInstance();} }
3. IOC(接口)
- IOC思想基于IOC容器完成,IOC容器底層就是對(duì)象工廠
- Spring提供IOC容器實(shí)現(xiàn)方式:(兩個(gè)接口)
- BeanFactory:IOC容器基本實(shí)現(xiàn),是Spring內(nèi)部的使用接口,不提供開(kāi)發(fā)人員進(jìn)行使用。
加載配置獲取文件時(shí)候不會(huì)創(chuàng)建對(duì)象,在獲取對(duì)象(使用)才去創(chuàng)建對(duì)象。 - ApplocationContext:BeanFactory接口的子接口,提供更多更強(qiáng)大的功能,一般由開(kāi)發(fā)人員進(jìn)行使用。
加載配置文件時(shí)候就會(huì)把在配置文件中的對(duì)象進(jìn)行創(chuàng)建。
- BeanFactory:IOC容器基本實(shí)現(xiàn),是Spring內(nèi)部的使用接口,不提供開(kāi)發(fā)人員進(jìn)行使用。
- ApplicationContext接口有實(shí)現(xiàn)類(lèi)
4. IOC操作Bean管理(概念)
- 什么是Bean管理? Bean管理有兩方面
- Spring創(chuàng)建對(duì)象
- Spring注入屬性
- Bean管理操作有兩種方式
- 基于xml配置文件方式實(shí)現(xiàn)
- 基于注解方式實(shí)現(xiàn)
5. IOC操作Bean管理(基于xml方式)
5.1 基于xml創(chuàng)建對(duì)象
<!-- 配置User對(duì)象 -->
<bean id="user" class="com.spring.User"></bean>
- 在spring配置文件中,使用bean標(biāo)簽,標(biāo)簽里面添加對(duì)應(yīng)屬性,就可以實(shí)現(xiàn)對(duì)象創(chuàng)建
- 在bean標(biāo)簽有很多屬性,介紹常用的屬性
- id屬性:唯一標(biāo)識(shí)
- class屬性:類(lèi)全路徑(包類(lèi)路徑)
- 創(chuàng)建對(duì)象時(shí)候,默認(rèn)也是執(zhí)行無(wú)參數(shù)構(gòu)造方法完成對(duì)象創(chuàng)建。
5.2 基于xml方式注入屬性
5.2.1 DI:依賴(lài)注入,就是注入屬性
- 第一種注入方式:set注入方式
- 創(chuàng)建類(lèi),定義屬性和對(duì)應(yīng)的set方法
- 在spring配置文件中配置對(duì)象創(chuàng)建,配置屬性注入。
<bean id="book" class="zsh.spring.Book"><!--2.set方法注入屬性--><!--name:類(lèi)里面屬性名稱(chēng)value:向?qū)傩宰⑷氲闹?-><property name="bname" value="天龍八部"></property><property name="bauthor" value="金庸"></property> </bean>
- 第二種注入方式:有參數(shù)構(gòu)造方式
- 創(chuàng)建類(lèi),定義屬性,創(chuàng)建屬性對(duì)應(yīng)有參構(gòu)造方法。
- 在spring配置文件中配置。
```xml
<!--3.有參構(gòu)造注入屬性-->
<bean id="orders" class="zsh.spring.Orders"><constructor-arg name="oname" value="abc"></constructor-arg><constructor-arg name="address" value="China"></constructor-arg>
</bean>
```
- p名稱(chēng)空間注入(了解)
- 使用p名稱(chēng)空間注入,可以簡(jiǎn)化基于xml配置方式。
<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">
- 進(jìn)行屬性注入,在bean標(biāo)簽里面進(jìn)行操作。
5.2.2 xml注入其他類(lèi)型屬性
- 字面量
- null值
<property name="address"><null></null> </property>
- 屬性值包含特殊符號(hào)
<!--屬性值包含特殊符號(hào)1.把《》進(jìn)行轉(zhuǎn)義2.把帶特殊符號(hào)內(nèi)容寫(xiě)到CDATA中--> <property name="bname"><value><![CDATA[《天龍八部》]]></value> </property>
5.2.3 注入屬性-外部bean
- 創(chuàng)建兩個(gè)類(lèi)service類(lèi)和dao類(lèi)
- 在service調(diào)用到里面的方法
public interface UserDao {public abstract void update();} public class UserDaoImpl implements UserDao {@Overridepublic void update() {System.out.println("dao update....");} } public class UserService {private UserDao userDao;public void setUserDao(UserDao userDao){this.userDao = userDao;}public void add(){System.out.println("service add .....");userDao.update();} }
- 在xml中配置
<!-- 1 service和dao對(duì)象創(chuàng)建 --> <bean id="userService" class="zsh.service.UserService"><!--name屬性:類(lèi)里面的屬性名稱(chēng)ref屬性:創(chuàng)建userDaoImpl對(duì)象bean標(biāo)簽--><property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="zsh.dao.Impl.UserDaoImpl"></bean>
5.2.4 注入屬性-內(nèi)部bean(很多人喜歡用外部bean,結(jié)構(gòu)明顯)
- 一對(duì)多關(guān)系:部門(mén)和員工(一個(gè)部門(mén)多個(gè)員工,一個(gè)員工屬于某一個(gè)部門(mén) )
- 在實(shí)體類(lèi)之間表示一對(duì)多關(guān)系,員工表示所屬部門(mén),使用對(duì)象類(lèi)型屬性進(jìn)行表示
//部門(mén)類(lèi) public class Dept {private String dname;public void setDname(String dname) {this.dname = dname;} } //員工類(lèi) public class Emp {private String ename;private String gender;//員工屬于某一個(gè)部門(mén)private Dept dept;public void setDept(Dept dept) {this.dept = dept;}public void setEname(String ename) {this.ename = ename;}public void setGender(String gender) {this.gender = gender;} }
- 在spring配置中進(jìn)行配置。
<!-- 內(nèi)部bean --> <bean id="emp" class="zsh.bean.Emp"><property name="ename" value="lucky"></property><property name="gender" value="女"></property><property name="dept"><bean id="dept" class="zsh.bean.Dept"><property name="dname" value="安保部"></property></bean></property> </bean>
5.2.5 注入屬性-級(jí)聯(lián)賦值
- 方式一:同外部bean注入
- 方式二:xml配置如下(需要在emp表給dept設(shè)置getter)
<!-- 級(jí)聯(lián)賦值 --> <bean id="emp" class="zsh.bean.Emp"><property name="ename" value="lucky"></property><property name="gender" value="女"></property><property name="dept" ref="dept"></property><property name="dept.dname" value="技術(shù)部"></property> </bean> <bean id="dept" class="zsh.bean.Dept"><property name="dname" value="安保部"></property> </bean>
5.2.6 xml注入集合屬性(數(shù)組、List、Map、Set)
- 創(chuàng)建類(lèi)、定義數(shù)組、List、Map、Set類(lèi)型屬性,生成對(duì)應(yīng)set方法。
public class Stu {private String[] courses;private List<String> list;private Map<String,String> maps;private Set<String> sets;public void setCourses(String[] courses){this.courses = courses;}public void setList(List<String> list){this.list = list;}public void setMaps(Map<String,String> maps){this.maps = maps;}public void setSets(Set<String> sets){this.sets = sets;} }
- 在Spring配置文件進(jìn)行配置。
<!-- 集合類(lèi)型屬性注入 --> <bean id="stu" class="zsh.shuzu.Stu"><!-- 數(shù)組類(lèi)型屬性注入 --><property name="courses"><array><value>java</value></array></property><!-- list類(lèi)型屬性注入,值是對(duì)象類(lèi)型 --><property name="list"><list><ref bean="course1"></ref><ref bean="course2"></ref></list></property><!-- Map類(lèi)型屬性注入 --><property name="maps"><map><entry key="JAVA" value="java"></entry></map></property><!-- Set類(lèi)型屬性注入 --><property name="sets"><set><value>MySql</value></set></property> </bean> <!--創(chuàng)建多個(gè)Course對(duì)象--> <bean id="course1" class="zsh.shuzu.Course"><property name="cname" value="Spring5框架"></property> </bean> <bean id="course2" class="zsh.shuzu.Course"><property name="cname" value="Mybatis框架"></property> </bean>
- 把集合注入部分提取出來(lái)。
- 在spring配置文件中引入名稱(chēng)空間util
<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"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
- 使用標(biāo)簽完成list集合注入提取
<util:list id="bookList"><ref bean="course1"></ref> </util:list> <!-- list類(lèi)型屬性注入,值是對(duì)象 --> <property name="courseList" ref="bookList"></property>
注意:面試中會(huì)問(wèn)DI 和 IOC區(qū)別?
DI 是 IOC中一種具體實(shí)現(xiàn),就表示依賴(lài)注入(注入屬性),注入屬性需要在創(chuàng)建對(duì)象的基礎(chǔ)之上。
6. IOC操作Bean管理(FactoryBean)
Spring有兩種類(lèi)型bean,一種普通bean,另一種工廠bean(FactoryBean)
- 普通bean:在配置文件中定義bean類(lèi)型就是返回類(lèi)型(上面的配置bean就是普通bean)
- 工廠bean:在配置文件定義bean類(lèi)型可以和返回值類(lèi)型不一樣
- 第一步:創(chuàng)建類(lèi),讓這個(gè)類(lèi)作為工廠bean,實(shí)現(xiàn)接口FactoryBean
- 第二步:實(shí)現(xiàn)接口里面的方法,在實(shí)現(xiàn)的方法中定義返回的bean類(lèi)型
public class MyBean implements FactoryBean<Course> {//定義返回bean@Overridepublic Course getObject() throws Exception {Course course = new Course();course.setCname("abc");return course;}@Overridepublic Class<?> getObjectType() {return null;} }
7、IOC操作Bean管理(bean作用域)
- 在Spring里面,設(shè)置創(chuàng)建bean實(shí)例默認(rèn)為單實(shí)例對(duì)象
- 如何設(shè)置單實(shí)例還是多實(shí)例?
- 在spring配置文件bean標(biāo)簽里面有屬性(scope)用于設(shè)置scope屬性值:
- 默認(rèn)值sigleton,表示單實(shí)例對(duì)象 ;
- prototype,表示多實(shí)例對(duì)象。
- 注意: sigleton和prototype區(qū)別?
第一:sigleton單實(shí)例,prototype多實(shí)例
第二:設(shè)置scope是sigleton時(shí)候,加載spring配置文件時(shí)候就會(huì)創(chuàng)建單實(shí)例對(duì)象。
第三:設(shè)置scope是prototype時(shí)候,不是在加載spring配置文件時(shí)候創(chuàng)建對(duì)象,在調(diào)用getBean方法時(shí)候創(chuàng)建多實(shí)例對(duì)象。
- 在spring配置文件bean標(biāo)簽里面有屬性(scope)用于設(shè)置scope屬性值:
8. IOCBean管理(bean生命周期)
- 生命周期:從對(duì)象創(chuàng)建到對(duì)象銷(xiāo)毀的過(guò)程
- bean生命周期五步(配置后置處理器七步)
- 通過(guò)構(gòu)造器創(chuàng)建bean實(shí)例(無(wú)參數(shù)構(gòu)造)
- 為bean的屬性設(shè)置值和對(duì)其它bean引用(調(diào)用set方法)
- 調(diào)用bean的初始化的方法(需要進(jìn)行配置初始化的方法)
- bean可以使用了(對(duì)象獲取到了)
- 當(dāng)容器關(guān)閉時(shí)候,調(diào)用bean的銷(xiāo)毀的方法(需要進(jìn)行配置銷(xiāo)毀的方法)
<bean id="xxx" class="xxx" init-method="initMethod" destroy-method="destroyMethod">
- bean的后置處理器,bean生命周期有七步(創(chuàng)建類(lèi)實(shí)現(xiàn)BeanPostProcessor并在xml配置成bean)
- 把bean實(shí)例傳遞bean后置處理器的方法(調(diào)用類(lèi)的before)
- 調(diào)用bean的初始化的方法(需要進(jìn)行配置初始化的方法)
- 把bean實(shí)例傳遞bean后置處理器的方法(調(diào)用類(lèi)的after)
9. IOC操作Bean管理(xml自動(dòng)裝配)
- 什么是自動(dòng)裝配?
根據(jù)指定裝配規(guī)則(屬性名稱(chēng)或者屬性類(lèi)型),Spring自動(dòng)將匹配的屬性值進(jìn)行注入。 - spring文件中配置(Emp中有Dept屬性)
<!--實(shí)現(xiàn)自動(dòng)裝配autowire屬性常用兩個(gè)值:byName根據(jù)屬性名稱(chēng)注入 注入bean的id值和類(lèi)的屬性名稱(chēng)一樣byType根據(jù)屬性類(lèi)型注入
-->
<bean id="emp" class="autowire.Emp" autowire="byName"></bean>
<bean id="dept" class="zsh.autowire.Dept"></bean>
10. IOC操作Bean管理(外部屬性文件)
- 直接配置數(shù)據(jù)庫(kù)信息(不展示了)
- 引入外部屬性文件配置數(shù)據(jù)庫(kù)連接池(德魯伊連接池)
<!-- 引入外部屬性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置連接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property>
</bean>
11. IOC操作Bean管理(基于注解方式:簡(jiǎn)化xml配置)
- Spring針對(duì)Bean管理中創(chuàng)建對(duì)象提供注解
@Component(value=“”)
@Service(value=“”)
@Controller(value=“”)
@Repository(value=“userDaoImp”)
上面四個(gè)注解功能是一樣的,都可以用來(lái)創(chuàng)建bean實(shí)例 - 基于注解方式實(shí)現(xiàn)對(duì)象創(chuàng)建
- 第一步:引入aop依賴(lài)jar包
- 第二步:開(kāi)啟組件掃描
<!--1 如果掃描多個(gè)包,多個(gè)包使用逗號(hào)隔開(kāi) ;2.掃描包上層目錄--><context:component-scan base-package=""/>
- 第三步:創(chuàng)建類(lèi),在類(lèi)上面添加創(chuàng)建對(duì)象注解
注意:開(kāi)啟組件掃描細(xì)節(jié)配置<!--示例一use-default-filters="false 表示現(xiàn)在不使用默認(rèn)filter,自己配置filtercontext:include-filter 表示掃描包下Controller注解 --> <context:component-scan base-package="com" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan><!-- 設(shè)置不去掃描哪些內(nèi)容 --> <context:component-scan base-package="com"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
12. 基于注解方式實(shí)現(xiàn)屬性注入
- Spring提供的注解
@AutoWired:根據(jù)屬性類(lèi)型進(jìn)行自動(dòng)裝配
@Qualifier(value=“userDaoImp”):根據(jù)屬性名稱(chēng)進(jìn)行自動(dòng)裝配(和@Autowired一起使用)
@Reaource(name=“userDaoImp”):可以根據(jù)類(lèi)型注入,也可以根據(jù)名稱(chēng)注入
注意:此注解的包是javax中的,不是spring中的
@Value:注入普通類(lèi)型屬性
13. 完全注解開(kāi)發(fā)
- 創(chuàng)建配置類(lèi),替代xml配置文件
@Configuration //配置類(lèi),替代xml配置文件@ComponentSean(basePackage={}) //包掃描public class SpringConfig{
}
- 編寫(xiě)測(cè)試類(lèi)
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);