日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五章spring框架基础

發布時間:2024/4/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五章spring框架基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spring框架

  • 一.spring
    • 概念:
    • 開發步驟:
      • 第1步: 添加jar包
      • 第2步: 創建Java類
      • 第3步: 創建Spring配置文件
      • 第4步: 編寫Spring配置文件
    • 二 .控制反轉
      • 概念:
      • 控制反轉實現方式:
        • 第1種: 構造方法
        • 第2種: 工廠類的靜態方法
        • 第3種: 工廠類的對象方法
        • 第4種: 注解方式
    • 三.依賴注入
      • 概念:
      • 依賴注入實現方式
        • 方式1: setter方式
        • 方式2: 構造函數
        • 方式3: 注解方式
        • 方式4: P命名空間
    • 四.使用注解實現SpringAOP
      • 面向切面編程:
        • 術語:
        • 通知類型:
        • AOP通知執行過程
        • 實現AOP方式
          • 方式一JDK動態代理:
          • 方式二CGLIB代理:
        • 使用注解方式實現AOP開發步驟:
          • 第1步: 添加jar包
          • 第2步:編寫切面類,設置切入點和通知
          • 第3步: 開啟aspectj自動代理,并注冊切面類
          • 第4步: 注冊AOP
          • 第5步: 正常編寫程序,測試AOP效果
        • 使用XML方式實現AOP
          • 第1步: 添加jar包
          • 第2步: 編寫切面類
          • 第3步: 編寫Spring配置文件
          • 第4步: 編寫程序,測試
  • mybatis與spring框架整合
    • 框架的作用:
    • Spring整合MyBatis:
      • 整合目標:
      • 整合步驟:
        • 第1步: 整合jar包
        • 第2步: 整合配置文件
        • 第3步: 整合代碼

一.spring

概念:

Spring是由Rod Johnson開發的一個開源容器框架,提供了控制反轉[IoC],依賴注入,面向切面[AOP],事務管理,框架整合等功能,用于簡化企業級應用開發.
特點:
1.輕量級:
Spring提供了許多服務,但這些服務默認關閉.同時,完整的Spring框架可以以在1M多大小的jar文件發布.
2.控制反轉:
應用本身不負責依賴對象(被調用對象)的創建及維護,由外部容器負責依賴對象的創建及維護.
3.面向切面:
在運行時,動態的將代碼切入到類的指定方法或位置上.
4.容器:
Spring包含并管理應用對象的配置和生命周期,因此Spring稱為容器.

下載Spring:
官網地址:http://www.springsource.org/download
下載地址:https://repo.spring.io/libs-release-local/org/springframework/spring/

JDK與版本:
Spring Framework3.x: JDK5+
Spring Framework4.x: JDK6+
Spring Framework5.x: JDK8+

開發步驟:

第1步: 添加jar包

commons-logging-1.2.jar spring-aop-5.1.2.RELEASE.jarspring-beans-5.1.2.RELEASE.jarspring-context-5.1.2.RELEASE.jarspring-core-5.1.2.RELEASE.jarspring-expression-5.1.2.RELEASE.jar

第2步: 創建Java類

創建1個實體類備注: 測試Spring框架控制實體類[創建實體類,提供實體類對象]

第3步: 創建Spring配置文件

配置文件名稱[beans.xml,application.xml,spring.xml,spring-bean.xml等等]任意,位置不限[src下].

配置文件模板位置[參考pdf或html]

第4步: 編寫Spring配置文件

<bean>用于將指定位置的Java類,交給Spring容器管理[控制反轉(幫你創建對象),依賴注入(向你提供對象)等等]示例:<bean class="bean.User" id="myuser" />

第5步: 測試程序

public static void main(String[] args) {//讀取配置文件ApplicationContext app=new ClassPathXmlApplicationContext("配置文件名.xml");//從Spring容器中獲得1個對象Object object= (Object ) app.getBean("id匿名");//Object-->Useruser.setName("小白");System.out.println(user);}

二 .控制反轉

概念:

控制反轉[Inversion of Control]指應用本身不負責依賴對象(被調用對象)的創建及維護,由外部容器負責依賴對象的創建及維護.

控制反轉實現方式:

第1種: 構造方法

<bean id="Bean匿名" class="類全名" /> ![對象的構造函數](https://img-blog.csdnimg.cn/20210607231802196.png)

第2種: 工廠類的靜態方法

<!-- Bean匿名=工廠類.靜態方法名() --> <bean id="Bean匿名" class="工廠類全名" factory-method="靜態方法名"/> ![工廠類的靜態方法](https://img-blog.csdnimg.cn/20210607231848352.png)


第3種: 工廠類的對象方法

<bean id="別名A" class="工廠類全名"/> <bean id="別名" factory-bean="別名A" factory-method="方法名"/>

第4種: 注解方式

a.添加context命名空間和context約束文件的地址b.添加<context:component-scan base-package="包名">c.在相關類上添加注解:注解: @Controller[標注在Action類上],@Service[標注在業務類上],@Repository,@Component[無法分辨層級,比如實體]作用: 聲明將當前類交給Spring容器管理. ![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210607232838939.png)


三.依賴注入

概念:

依賴注入[Dependency Injection]指在運行期,由外部容器動態地將依賴對象[要使用的對象]注入到組件中. 注意: 依賴注入的前提是控制反轉,被注入對象和接受注入的對象都必須被Spring容器管理.

依賴注入實現方式

方式1: setter方式

Java類: private 普通屬性類型 屬性名; private 自定義類類型 屬性名; private 集合類型 屬性名; //提供setter和getter 配置文件: <bean id="Bean對象匿名" class="類全名"><property name="屬性名" value="值" /><property name="屬性名" ref="Bean對象匿名" /><property name="屬性名"><list>\<value><set>\<value><map>\<entry><props>\<prop></property> </bean>//使用setter方式示例代碼 <bean class="bean.Car" id="car"/> <bean id="di_setter" class="bean.DI_Setter"><!--1.setter方式--><!--普通數據--><property name="id" value="1"/><property name="name" value="小蜜瓜"/><property name="income" value="12000"/><property name="sex" value="女"/><property name="marry" value="true"/><!--對象數據--><property name="car" ref="car"/><!--集合數據--><property name="myList" ><list ><value>AAA</value><value>BBB</value><value>CCC</value></list></property><property name="myMap"><map><entry key="a" value="1"/><entry key="b" value="2"/><entry key="b" value="3"/></map></property><property name="mySet"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></property> </bean>

方式2: 構造函數

Java類: private 普通屬性類型 屬性名; private 自定義類類型 屬性名; private 集合類型 屬性名; //提供有參構造方法 配置文件: <bean id="Bean對象匿名" class="類全名"><constructor-arg index="參數索引" value="值" /><constructor-arg index="參數索引" type="類全名" ref="Bean對象匿名" /><constructor-arg index="參數索引" ><list/set/map/props>[參考setter方式]</constructor-arg> </bean>//構造函數使用示例<bean class="bean.Car" id="car"/> <bean id="di_setter" class="bean.DI_Setter"><!--1.構造函數方式--><!--普通數據--> <constructor-arg name="id" value="1"/><constructor-arg name="name" value="小蜜瓜"/><constructor-arg name="income" value="12000"/><constructor-arg name="sex" value="女"/><constructor-arg name="marry" value="true"/><!--對象數據--><constructor-arg name="car" ref="car"/><!--list集合數據--><constructor-arg name="myList" ><list ><value>AAA</value><value>BBB</value><value>CCC</value></list></constructor-arg><!---map集合數據--><constructor-arg name="myMap"><map><entry key="a" value="1"/><entry key="b" value="2"/><entry key="b" value="3"/></map></constructor-arg><!--set方法--><constructor-arg name="mySet"><set><value>AAA</value><value>BBB</value><value>CCC</value></set></constructor-arg> </bean>

方式3: 注解方式

Java類與配置文件:
a.配置文件中context命名空間和context約束文件的地址

b.配置文件中添加<context:component-scan base-package=“包名” />

c.在Java類的屬性或setter上添加注解: @Autowired或@Resource.

@Autowired:
格式: @Autowired [(required=true)]
說明:
1.編寫在屬性或setter上,表示將Spring容器中同類型的Bean對象賦給該屬性
2.根據屬性類型到Spring容器中尋找bean對象,然后注入依賴對象
3.required默認為true,即配置文件中必須有同類型的Bean對象,否則報錯

@Resource:
格式: @Resource[(name=“Bean對象匿名”)]
說明:
1.編寫在屬性或setter上面,表示將Bean對象匿名對應的對象賦給該屬性
2.name屬性值為Bean對象匿名,表示將Bean對象匿名對應的對象賦給該屬性
3.@Resource標注在setter上或不設置name屬性,則name屬性值默認為屬性名
4.若未設置name屬性,并且按照默認名稱仍然找不到依賴對象時,@Resource將會按屬性類型查找同類型的bean對象,然后注入到屬性中.

方式4: P命名空間

Java類:
提供屬性的setter和getter方法,無需其他操作.

配置文件:

第1步: 添加命名空間
xmlns:p=“http://www.springframework.org/schema/p”

第2步: 注冊bean,并注入數據
<bean id=“bean匿名” class=“類全名” p:屬性名/屬性名-ref=“值/匿名” />

四.使用注解實現SpringAOP

面向切面編程:

面向切面編程[Aspect Oriented Programming,簡稱AOP]指在運行時,動態的將代碼切入到類的指定方法或位置上的編程思想.

術語:

  • aspect(切面): 指橫切性關注點的抽象即為切面,它與類相似,類是對物體特征的抽象.[通俗講,切面是定義了額外功能的類].
  • joinpoint(連接點): 指被攔截的點,分為屬性,方法,構造器.Spring只支持方法類型的連接點.[通俗講,應用額外功能的地方稱為連接點]
  • pointcut(切入點): 指對"連接點"進行攔截的定義.[通俗講,控制"哪些地方"應用切面]
  • advice(通知): 指攔截到"連接點"之后所要做的事情.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知.
  • target(目標對象): 指要使用切面的類.
  • weave(織入): 指將"切面"應用到"目標對象"并導致"代理對象"創建的過程稱為織入.
  • introduction(引入): 在不修改類代碼的前提下,Introduction可以在運行期為類動態地添加一些方法或Field.

通知類型:

前置通知: 在目標方法執行之前,執行前置通知 后置通知: 在目標方法執行之后,執行后置通知 異常通知: 在目標方法執行并拋出異常時,執行異常通知 最終通知: 在目標方法執行之后或拋出異常時,執行最終通知 環繞通知: 在前置通知和目標方法之前,以及最終通知之前執行環繞通知

AOP通知執行過程


實現AOP方式

Spring提供了多種方式實現AOP,常用:(JDK動態代理和CGLIB代理)

方式一JDK動態代理:

使用Proxy類創建代理對象,含有處理類必須實現InvocationHandler接口.目標類必須實現接口[不限制類型],JDK動態代理通過實現目標類實現的所有接口,實現動態代理功能

方式二CGLIB代理:

使用Enhancer類生成代理對象,含有處理類必須實現MethodInterceptor接口.CGLIB通過生成目標類的子類,并重寫目標類非final的方法實現動態代理功能

代理方式選擇:
1.默認情況下,目標對象[被攔截的對象]必須實現了接口,Spring才會使用JDK動態代理.否則,Spring自動使用CGLIB代理
2.當目標對象實現了接口,可以設置aop:aspectj-autoproxy的proxy-target-class為true,強制使用CGLIB代理

使用注解方式實現AOP開發步驟:

第1步: 添加jar包

第2步:編寫切面類,設置切入點和通知
  • @Aspect: 編寫在類聲明上面,表示聲明當前類為切面類
  • @Pointcut: 編寫在方法上面,定義切入點要求,"方法名()"即為切入點名
    格式:@Pointcut(value = “execution(表達式)”)

表達式:
execution(返回值類型 目錄.類名.方法名(參數類型,…) && args(參數名,參數名,…))
說明:
1.返回值類型為void或類型全名,可配合"!“使用.[!void表示有返回值]
2.任意返回值/任意類名/任意方法名,都可以用”“表示.
3.若包含指定目錄的任意子目錄,用”.“表示
4.參數類型為類全名.任意個數和類型用”…"表示
5.args()表示必須有指定個數的參數
示例:@Pointcut(value = "execution( service.UserService.*(…))")

  • @Before :編寫在方法上面,鄙視聲明當前方法為前置通知
    格式: @Before(value=“切入點名”,argNames=“參名,…”)
  • @AfterReturning: 編寫在方法上面,表示聲明當前方法為后置通知
    格式: @AfterReturning(value=“切入點名”,return=“參數名[接收返回值]”)
  • @After: 編寫在方法上面,表示聲明當前方法為最終通知
    格式: @After(value=“切入點名”)
  • @AfterThrowing: 編寫在方法上面,表示聲明當前方法為例外通知
    格式: @AfterThrowing(value=“切入點名”,throwing=“參數名[接收異常對象]”)
  • @Around: 編寫在方法上面,表示聲明當前方法為環繞通知
    格式: @Around(value=“切入點名”)

說明:
public Object 環繞通知(ProceedingJoinPoint point){
Object rs=point.proceed();//繼續執行下1個通知或調用目標方法
return rs; //必須返回,否則后置通知無法獲得目標方法返回值
}

定義切面類 在切面類中切入點上說明攔截目標 實現動態添加 @Component @Aspect //聲明當前類為切入類 切入類包含額外的方法 public class AOP {//定義一個切入點 @Pointcut(value = "execution(* service.UserService.*(..))")public void test(){System.out.println("定義切入點:切入點為被標注的方法的名稱");}//定義前置通知[用來攔截方法的參數]@Before(value = "test() && args(p1) ",argNames = "p1")public void qianzhitongzhi(Object p1){System.out.println("前置通知");System.out.println("攔截的方法參數"+p1);}//定義后置通知[用來攔截方法的返回值]@AfterReturning(value = "test()",returning = "returnDate")public void houzhitongzhi(Object returnDate){System.out.println("后置通知");System.out.println("被攔截的方法的返回值為"+returnDate);}@After("test()")public void zuizhongtongzhi(){System.out.println("最終通知");}//定義異常通知[用來攔截異常和打印異常信息]@AfterThrowing(value = "test()",throwing = "e")public void yichangtongzhi(Exception e){System.out.println("異常通知");System.out.println(e.getMessage());}//環繞通知@Around("test()")public Object huanraotongzhi(ProceedingJoinPoint point ) throws Throwable {System.out.println("進入環繞通知");Object ob = point.proceed();System.out.println("離開環繞通知");return ob;} }

注意: @Before,@AfterReturning,@After,@AfterThrowing,@Aroud默認屬性為value[切入點名]

第3步: 開啟aspectj自動代理,并注冊切面類
<context:component-scan base-package="bean,service,aop"/<!--開啟自動掃描并將有注釋的類自動注冊--> <aop:aspectj-autoproxy/><!--啟動AspectJ自動代理功能-->

第4步: 注冊AOP
<!--注冊切面類--><bean id="myaop" class="aop.MyAOP" />或@Component <!--若使用注釋即可自動注冊該類-->
第5步: 正常編寫程序,測試AOP效果

使用XML方式實現AOP

步驟:

第1步: 添加jar包

同annotation方式

第2步: 編寫切面類

同annotation方式,但是移除所有的注解[在配置文件中實現注解的功能].

/*@Component*/ @Aspect /*聲明當前類為切入類 切入類包含額外的方法*/ public class AOP1 {@Pointcut(value = "execution(* service.UserService.*(..))")public void test(){System.out.println("定義切入點:切入點為被標注的方法的名稱");}@Before("test()")public void qianzhitongzhi(){System.out.println("前置通知");}@AfterReturning("test()")public void houzhitongzhi(){System.out.println("后置通知");}@After("test()")public void zuizhongtongzhi(){System.out.println("最終通知");}@AfterThrowing("test()")public void yichangtongzhi(){System.out.println("異常通知");}//環繞通知-@Around("test()")public Object huanraotongzhi(ProceedingJoinPoint point ) throws Throwable {System.out.println("進入環繞通知");Object ob = point.proceed();System.out.println("離開環繞通知");return ob;} }
第3步: 編寫Spring配置文件

a.將切面類交給Spring管理
b.配置面向切面

<!--開啟自動掃描--> <context:component-scan base-package="bean,service,aop"/> <aop:config><!--定義1個切面類--><aop:aspect id="myaop" ref="myAOP"><!--定義1個切入點攔截service.UserService類中的所有方法(有參無參)--><aop:pointcut id="mycut" expression="execution(* service.UserService.*(..))"/><!--定義通知--><aop:before method="beforeDeal" pointcut-ref="mycut" arg-names="joinPoint" /><aop:after-returning method="afterReturningDeal" pointcut-ref="mycut" returning="returnData"/><aop:after method="afterDeal" pointcut-ref="mycut" /><aop:after-throwing method="afterThrowingDeal" pointcut-ref="mycut" throwing="e"/><aop:around method="aroundDeal" pointcut-ref="mycut" /></aop:aspect> </aop:config>
第4步: 編寫程序,測試

同annotation方式

mybatis與spring框架整合

框架的作用:

MyBatis: 用于替代JDBC,用于數據持久化
Spring: 用于整合框架,提供整合功能及其他功能[IoC,DI,AOP,事務管理等等]
SpringMVC: 用于替代JSP,用于處理請求和響應[SpringMVC屬于Spring的一部分]

Spring整合MyBatis:

MyBatis功能/操作: 配置文件[實體類別名,數據源,映射文件等等],映射文件[業務標簽],MyBatis代碼[SqlSessionFactory,SqlSession等對象操作]
Spring功能/操作: IoC,DI,AOP,事務管理

整合目標:

  • 用Spring來替代MyBatis中的數據源,提供SqlSessionFactory,SqlSession等對象,管理事務
  • .MyBatis整合中要做的內容: 配置文件[保留 實體類別名,映射文件等等],映射文件[業務標簽]無變化,MyBatis代碼[業務代碼]

整合步驟:

第1步: 整合jar包

  • MyBatis相關jar包:
    mybatis-3.5.1.jar
    log4j-1.2.17.jar
  • 數據庫驅動器:
    mysql-connector-java-5.1.22-bin.jar
  • Spring相關jar:
    commons-logging-1.2.jar
    spring-aop-5.1.2.RELEASE.jar
    spring-beans-5.1.2.RELEASE.jar
    spring-context-5.1.2.RELEASE.jar
    spring-core-5.1.2.RELEASE.jar
    spring-expression-5.1.2.RELEASE.jar
  • spring-jdbc-5.1.2.RELEASE.jar
    spring-tx-5.1.2.RELEASE.jar
  • aopalliance-.jar
    aspectjrt.jar
    aspectjweaver.jar
    cglib-nodep-2.1_3.jar
  • 額外jar:
    連接池: commons-dbcp-1.4.jar,commons-pool-1.6.jar
    MyBatis與Spring整合: mybatis-spring-2.0.3.jar
  • 第2步: 整合配置文件

    MyBatis配置文件:
    mybatis-conf.xml[實體類別名,環境(數據源),加載映射],
    log4j.xml[控制日志輸出],映射文件[業務標簽]
    Spring配置文件: application.xml[控制反轉]

    整合后:
    MyBatis配置文件中: 去掉環境配置(數據源),實體類別名,加載映射

    log4j.xml[控制日志輸出]: 無需操作
    映射文件[業務標簽]: 無需操作、
    Spring配置文件中: 添加數據源,提供SqlSessionFactory,提供事務管理
    1.開啟自動掃描: 掃描service,action,mapper等等,實現控制反轉[管理相關對象]---->注解方式實現控制反轉
    2.提供數據源
    3.提供SqlSessionFactoryBean
    4.提供事務管理 @@Transactional標注的類中所有關于數據庫操作時,自動提交事務,以及回滾事務
    5.注冊其他必須的對象

    第3步: 整合代碼

    MyBatis代碼正常編寫即可,若需要SqlSessionFactory對象可以從Spring容器中獲得.

    Mapper方式實現CURD:
    1.Mapper接口: 正常編寫
    2.業務類: 聲明Mapper接口類型的屬性,并由Spring注入屬性值
    3.注冊Mapper接口:

    方式1: 指定加載某個1Mapper接口<bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="mapperFactoryBean"><property name="sqlSessionFactory" ref="factory" /><property name="mapperInterface" value="mapper.UserMapper" /></bean>方式2: 指定加載某個包中的所有Mapper接口<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="mapperScannerConfigurer" ><property name="sqlSessionFactoryBeanName" value="factory" /><property name="basePackage" value="mapper" /></bean>

    總結

    以上是生活随笔為你收集整理的第五章spring框架基础的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。