Spring的主要內容總結
阿新 • • 發佈:2021-08-17
一.spring是什麼
spring是一個框架,整合了多種技術.
spring的特點是IOC(控制反轉),AOP(面向切面程式設計)
1.IOC和AOP兩個思想簡要理解
IOC:讓程式自己動態建立物件,建立物件權利是程式而不是程式設計師
AOP:在不改變原有程式碼的情況下,實現插入程式碼(新增功能)
2.maven匯入spring
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency>
二.IOC在spring中的實現
1.建立物件通過描述(xml或註解)獲得
spring中可以實現通過xml檔案或者註解提供的資訊建立物件,並存放在IOC容器中
2.如何通過描述建立物件---依賴注入
問題是spring如何通過資訊完成物件建立,涉及兩方面取資訊和處理資訊
- 處理資訊涉及spring的內部實現,暫且不表
- 取資訊:若是xml檔案實現資訊,就應該讓其按照特定的格式放置資訊,取名為依賴注入
依賴注入:依賴實體類的set方法和構造器,進行注入
依賴注入的方式:建立bean物件,對其進行屬性注入或者構造器注入,同時也能修改其
作用域(單例還是多例)
3.第一個IOC容器中物件的建立
- 1.編寫hello實體類
public class Hello { private String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }
- 2.匯入相關jar包,建立bean.xml檔案
- 3.編寫bean檔案,在beans標籤下新增bean標籤,同時對此類進行資訊注入來建立物件
<?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"
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-context4.0.xsd">
<!-- 使用spring來建立物件,spring中都稱物件標籤為bean-->
<!-- xml檔案中想要給出建立物件的資訊,必須按照格式進行資訊填入-->
<bean id="hello" class="com.cs.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
<!--
ref:引用Spring容器中建立好的物件
value:對物件屬性賦的值
-->
</beans>
- 4.建立測試類來測試物件是否生成
//spring通過beans.xml檔案獲得了建立物件的資訊,然後建立物件放入context容器中
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通過context能夠取到物件
Hello hello = (Hello)context.getBean("hello");
3.bean的自動裝配
通過在bean後面新增autowire=byName/byType修飾能夠實現bean的自動裝配
也可以通過使用註解進行bean的自動裝配,在xml檔案中開啟使用註解(context:annotation-config),在編寫實體類時新增相關注解(不僅僅是@autowire,還能是@Componet實現不寫bean也能注入建立物件)即可
三.AOP在spring中的實現
1.aop的底層---代理模式
通過一個代理類讓真實類執行的業務變單一純粹,體現分工明確
- 實現組成:事件,實體,代理類(實體只專注與事件,代理類不僅幫助完成事件還能新增各種功能,能夠讓實體完成的事件更加完備)
- 程式碼實現,Proxy,InvocationHandler,具體應用舉例:JDK,cglib
2.Aspect Oriented Prgramming(面向切面程式設計)
通過aop的原理可以知道,aop可以在不影響原本程式碼實現的情況下新增程式碼在程式中
- 1).使用AOP思路
匯入對應的jar包
建立你要切入的物件(註解,自定義類,springAPI)
通過配置檔案將切入物件(切面)放到切入點上
當執行程式碼時切入點的切面的通知會被執行 - 2).AOP實現的程式碼結合程式複習
四.spring與mybatis結合
1.將資料來源放入ioc容器中
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
2.將sqlsessionFactory,sqlsession放入ioc容器中
<!-- sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 繫結mybatis配置檔案-->
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
<property name="mapperLocations" value="classpath:com/cs/mapper/UserMapper.xml"/>
</bean>
<!-- sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 使用構造器注入sqlSessionFactory 因為沒有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="userMapper2" class="com.cs.mapper.UserMapperImpl2">
</bean>
3.建立實體類和對應的dao(mapper)完成CRUD任務
@Data
public class User {
private int id;
private String name;
private String pwd;
}
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
@Override
public List<User> selectUser() {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
return users;
}
}
額外:spring中事務的處理
通過aop思想實現事務的四大特性ACID
<!-- 建立開啟事務的物件-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
<!-- 結合AOP實現事務的植入-->
<!-- 配置事務的類-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 給那些事件新增事務-->
<tx:attributes>
<tx:method name="add"/>
<tx:method name="delete"/>
<tx:method name="update"/>
</tx:attributes>
</tx:advice>
<!-- 配置事務的切入點-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.cs.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>