網(wǎng)站點擊率如何做百度一下百度
文章目錄
- spring分層架構(gòu)
- 表現(xiàn)層
- 服務(wù)層(業(yè)務(wù)層)
- 持久層
- spring核心
- ioc(控制反轉(zhuǎn))
- 1)**接下來是代碼示例:**
- 2)**ioc容器的使用過程**
- 3)ioc中的bean管理
- 4)實例化bean的三種方式
- aop(面向切面開發(fā))
- 定義
- 優(yōu)勢
- AOP底層原理
- AOP相關(guān)的術(shù)語
- AOP入門
- aop注解開發(fā)
- aop純注解開發(fā)
- Di(依賴注入)
- 1)屬性的set方法注入值的方式
- 2)構(gòu)造方法賦值的方法
- 多配置文件
- 多配置文件
spring分層架構(gòu)
-
表現(xiàn)層
springmvc
-
服務(wù)層(業(yè)務(wù)層)
spring ioc
-
持久層
mybatis
mybatis plus
hibernite
互聯(lián)網(wǎng)項目,多ssm結(jié)構(gòu)
spring核心
-
ioc(控制反轉(zhuǎn))
ioc將對象的創(chuàng)建權(quán)利交給spring框架,底層實際上是使用反射實現(xiàn)的。降低程序的耦合度
1)接下來是代碼示例:
-
創(chuàng)建一個空的maven項目
-
引入一些基本依賴
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
-
準備實體類
// 創(chuàng)建一個接口 public interface UserService {public void hello(); } // 創(chuàng)建一個實體類 public class UserServiceImpl implements UserService {@Overridepublic void hello() {System.out.println("Hello, world!");} }
-
準備配置文件
<?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="us" class="實體類的路徑"></bean> </beans>
-
在test中測試
// 常規(guī)方法@Testpublic void testUser() {// TODO: write test cases for UserServiceUserService userService = new UserServiceImpl();userService.hello();} // 基于ioc容器管理的方法,ioc是一個map key是對象的標識,value是ioc創(chuàng)建的對象@Testpublic void run1() {// 創(chuàng)建spring ioc工廠ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");// 獲取beanUserService userService = (UserService) ac.getBean("us");userService.hello();}
上面就是一個關(guān)于ioc容器的示例
2)ioc容器的使用過程
ApplicationContext接口,這個工廠接口,使用這個接口就可以獲得相應(yīng)的Bean對象,該對象下有兩個實現(xiàn)類
- ClassPathXmlApplicationContext:加載類路徑下的spring配置文件(常用)
- FileSystemXmlApplicationContext:加載本地磁盤下的spring配置文件(讓項目和配置文件分離管理,不常用)
3)ioc中的bean管理
- id屬性:bean的別名,取名要求:必須要字母開頭,可以使用數(shù)字,連字符,下劃線,字母,不能出現(xiàn)特殊字符
- class屬性:bean對象的全路徑
- scope屬性: bean對象的作用范圍
- singleton:單例(默認)生命周期和配置文件一樣
- prototype:多例,不是加載配置文件時創(chuàng)建,而是在獲取實例對象時創(chuàng)建
- request: 多例,不常用,應(yīng)用于web項目中,每個請求都會創(chuàng)建一個新的實例對象
- session:多例,不常用,應(yīng)用于web項目中,向一個http session中共享一個實例
- init-method:bean對象創(chuàng)建時可以配置一個指定的方法自動調(diào)用
- destory-method:bean對象銷毀時可以配置一個指定的方并自動調(diào)用
4)實例化bean的三種方式
-
默認是無參的構(gòu)造方法
<bean id="us" class="實體類的路徑"></bean>
-
靜態(tài)工廠實例化方法(好處是可以自己編寫業(yè)務(wù)邏輯)
準備一個靜態(tài)工廠類
public class StaticFactory {public static UserService createUser() {// 編寫業(yè)務(wù)邏輯// ......return new UserServiceImpl();} }
在xml配置文件中使用
<bean id="us1" class="com.qc.util.StaticFactory" factory-method="createUser"></bean>
-
實例化工廠實例化方式
準備一個可以實例化的類
public class DFactory {public UserService createUser() {// 編寫業(yè)務(wù)邏輯return new UserServiceImpl();} }
在xml配置文件中使用
<bean id="factory" class="com.qc.util.DFactory"></bean><bean id="us2" factory-bean="factory" factory-method="createUser"></bean>
-
-
aop(面向切面開發(fā))
定義
? 是一種編輯的范式,是OOP的延續(xù),也是Spring框架中函數(shù)編程的一種衍生范式,利用AOP可以對業(yè)務(wù)的各個部分進行隔離,從而似的業(yè)務(wù)邏輯各部分之間的耦合度降低,提高了程序的重用性,同時提高了開發(fā)的效率,AOP采用橫向抽取機制,取代了傳統(tǒng)縱向繼承體系。
優(yōu)勢
- 運行期間,不修改源代碼的情況下,對已有的方法進行增強,減少重復(fù)代碼
- 提高開發(fā)效率
- 方便維護
AOP底層原理
- 如果使用接口,則使用JDK動態(tài)代理技術(shù),如果沒有使用接口,使用的是繼承則是cglib代理
AOP相關(guān)的術(shù)語
- Joinpoint(連接點)所謂連接點是指那些被連接到的點,在spring中,這些帶點指的是方法,因為spring只支持方法類型的節(jié)點
- Pointcut(切入點)所謂切入點是我們要對哪些Joinpoint進行攔截的定義
- Advice(通知\通知)所謂通知就是指,攔截到Joinpoint之后所要做的情況就就是通知,通知分為,前置通知,后置通知,異常通知,最終通知,環(huán)繞通知(切面類中要完成的功能)
- Target(目標對象)代理的目標對象
- Weaving(織入)是指把增強應(yīng)用到目標對象來創(chuàng)建新的代理對象的過程
- Proxy(代理)一個類被AOP織入增強后,就產(chǎn)生一個結(jié)果代理類
- Aspect(切面)是切入點+通知的結(jié)合,是自己編寫和配置
AOP入門
-
導(dǎo)入坐標依賴
<dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
<?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"xmlns:aop="http://www.springframework.org/schema/aop"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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
-
編寫spirng配置文件中AOP的配置部分
<!-- bean管理--><bean id="us" class="com.qc.service.impl.UserServiceImpl"/><bean id="myAspect" class="com.qc.util.MyAspect"/><!-- 配置aop--><aop:config><!-- 配置切面--><aop:aspect ref="myAspect"><!-- 前綴通知--><aop:before method="log1" pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 后置通知--><aop:after-returning method="log2"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 異常通知--><aop:after-throwing method="log3"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 最終通知--><aop:after method="log4"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 環(huán)繞通知--><aop:around method="aroundLog"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/></aop:aspect></aop:config>
import org.aspectj.lang.ProceedingJoinPoint;public class MyAspect {// 自定義切面類 = 切入點+通知//通知public void log1() {System.out.println("前置增強的");}public void log2() {System.out.println("后置增強的");}public void log3() {System.out.println("異常增強的");}public void log4() {System.out.println("最終增強的");}public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); // 目標方法調(diào)用log2();} catch (Throwable e) {e.printStackTrace();log3();} finally {log4();}} }
注意環(huán)繞通知使用的接口
通知類型
- 前置通知:目標方法執(zhí)行前進行增強
- 后置通知:目標方法執(zhí)行后進行增強
- 異常通知:目標方法出現(xiàn)異常后進行增強
- 最終通知:目標方法無論是否異常都進行增強
- 環(huán)繞通知:目標方法執(zhí)行前后,都進行增強,不過需要自己書寫
切入點表達式
- execution([修飾符] 返回值 包名.類名.方法名(參數(shù)))
- 修飾符可以省略不寫
- 返回值類型不能省略,根據(jù)方法來編寫返回值,可以用星號來代替
- 包名類型方法名是不能省略的,但是可以用星號來代替,也可以部分代替
- 參數(shù)如果是一個可以用星號來代替,如果是多個可以使用兩個點
因此比較通用的表達式:
execution( com.qc.*.Service.save(…))
aop注解開發(fā)
給切面添加@Aspect,編寫增強的方法,使用通知類型注解聲明
<!-- 開啟注解掃描--><context:component-scan base-package="com.qc"/><!-- 開啟自動代理--><aop:aspectj-autoproxy/>
@Aspect @Component public class MyAspect {// 自定義切面類 = 切入點+通知//通知@Before("execution(* com.qc.*.*.*ServiceImpl.save(..))")public void log1() {System.out.println("前置增強的");}@AfterReturning("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log2() {System.out.println("后置增強的");}@AfterThrowing("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log3() {System.out.println("異常增強的");}@After("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log4() {System.out.println("最終增強的");}@Around("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); // 目標方法調(diào)用log2();} catch (Throwable e) {e.printStackTrace();log3();} finally {log4();}} }
在每個方法上使用注解進行配置,和配置文件類似
通知類型注解:
- @Before 前置注解
- @AfterReturning 后置注解
- @AfterThrowing 異常注解
- @After 最終注解
- @Round 環(huán)繞注解
注意:在配置文件中開啟自動代理
aop純注解開發(fā)
@EnableAspectJAutoProxy 開啟自動代理
-
Di(依賴注入)
依賴注入:在spring框架負責創(chuàng)建bean對象時,動態(tài)的將對象注入到其他的bean對象中
1)屬性的set方法注入值的方式
-
聲明變量并在需要依賴注入的地方設(shè)置set方法
-
在xml文件中配置該變量的值
<bean id="us" class="com.qc.service.impl.UserServiceImpl"><property name="userDao" ref=""></property><property name="name" value=""></property></bean>
參數(shù)說明:如果property中的是一個簡單類型(基本類型和字符串),那么就使用value,否則就使用ref
2)構(gòu)造方法賦值的方法
-
在需要的地方添加構(gòu)造方法
-
在配置文件中使用帶參數(shù)的構(gòu)造方法傳參
<bean id="userDao" class="com.qc.dao.impl.UserDaoImpl"></bean><bean id="us" class="com.qc.service.impl.UserServiceImpl"><constructor-arg name="userDao" ref="userDao"></constructor-arg></bean>
-
其他類型的參數(shù)傳參
準備一個java類
public class CollectionBean {private String[] strs;private List<String> list;private Map<String, String> map;private Properties properties;public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public String[] getStrs() {return strs;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public CollectionBean() {}public void setStrs(String[] strs) {this.strs = strs;}public CollectionBean(String[] strs) {this.strs = strs;} }
-
不可變數(shù)組
<bean id="co" class="com.qc.service.CollectionBean"><property name="strs"><array><value>小美</value><value>小張</value><value>小王</value></array></property></bean>
-
可變集合
<bean id="co" class="com.qc.service.CollectionBean"><property name="list"><list><value>張三</value><value>李四</value><value>王五</value></list></property></bean>
-
map集合
<bean id="co" class="com.qc.service.CollectionBean"><property name="map"><map><entry key="name" value="zhangsan"></entry><entry key="age" value="18"></entry></map></property></bean>
-
其他類型
<bean id="co" class="com.qc.service.CollectionBean"><property name="properties"><props><prop key="username">zhangsan</prop><prop key="password">1234</prop></props></property></bean>
-
-
-
多配置文件
-
在配置文件中使用
<import resource="applicationContext.xml"></import>
-
創(chuàng)建工廠時直接加載多個配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
-
?
<props><prop key="username">zhangsan</prop><prop key="password">1234</prop></props></property></bean>```
-
多配置文件
-
在配置文件中使用
<import resource="applicationContext.xml"></import>
-
創(chuàng)建工廠時直接加載多個配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
-
?