javascript
后端学习 - Spring5
文章目錄
- 一 簡介
- 二 IOC
- 1 底層原理
- 2 實現過程
- 3 Spring 實現 IOC 的兩個接口
- 二 Bean
- 1 普通 Bean 與 FactoryBean
- 2 Bean 單例與否的設置
- 3 Bean 的生命周期
- 三 IOC 的 Bean 管理(XML)
- 1 創建對象
- 2 屬性注入 - 使用 set 方法
- 3 屬性注入 - 通過有參構造器實現
- 3 注入屬性為 null / 包含特殊符號
- 4 注入外部 Bean
- 5 注入內部 Bean
- 6 注入 array / list / map / set
- 7 自動裝配
- 8 使用外部文件配置 Bean
- 四 IOC 的 Bean 管理(注解)
- 1 Spring 針對創建 Bean 對象提供的注解
- 2 創建對象的步驟
- 3 屬性注入 - @Autowared
- 4 屬性注入 - @Qualifier
- 5 屬性注入 - @Resource
- 6 屬性注入 - @Value
- 7 完全注解開發
- 五 AOP 概述
- 1 動態代理的兩種情況
- 2 JDK 動態代理實例
- 六 AspectJ 的使用(注解)
- 1 切入點表達式
- 2 使用流程
- 3 相同切入點的抽取
- 4 完全注解開發
- 七 JdbcTemplate
- 1 配置
- 2 添加 / 修改 / 刪除 操作
- 3 查詢值
- 4 查詢單個對象
- 5 查詢多個對象
- 八 Spring 事務管理
- 1 注解聲明式事務管理的步驟
- 2 @Transactional 的參數配置
- 3 完全注解的 聲明式事務管理
一 簡介
- Spring 是輕量級的開源的 JavaEE 框架
- Spring 有兩個核心部分:IOC(Inversion of Control,控制反轉) 和 AOP(Aspect Oriented Programming,面向切面編程)
- IOC 是一種設計思想,核心是,將設計好的對象交給容器控制,而不是傳統的在對象內部直接控制。 把創建和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,所以對象與對象之間是松散的耦合。
- AOP 是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。簡言之,AOP 可以做到不修改源代碼進行功能增強。OOP 面向名詞領域,AOP 面向動詞領域。
二 IOC
1 底層原理
- xml 解析
- 工廠模式
- 反射
2 實現過程
經過上述過程,各類間進一步解耦。例如,此時 xml 配置中,class 屬性變動不會對其創建造成影響。
3 Spring 實現 IOC 的兩個接口
二 Bean
1 普通 Bean 與 FactoryBean
- 普通 Bean 的定義類型和返回類型相同,而 FactoryBean 的定義類型和返回類型可以不同
- 要創建 FactoryBean,需要實現接口 FactoryBean<T>
2 Bean 單例與否的設置
- 默認 Bean 是單例對象
- 通過 Bean 標簽的 scope="singleton" / "prototype" 選擇單例與否
- 設置 scope = "singleton" ,加載 spring 配置文件時候就會創建單實例對象;設置 scope = "prototype" ,在調用 getBean 方法時候創建多實例對象
3 Bean 的生命周期
(1)通過構造器創建 bean 實例(無參構造)
(2)為 bean 的屬性設置值和對其他 bean 引用(調用 set 方法)
(3)把 bean 實例傳遞 bean 后置處理器的方法 postProcessBeforeInitialization(可選)
(4)調用 bean 的初始化的方法(需要配置初始化的方法)
(5)把 bean 實例傳遞 bean 后置處理器的方法 postProcessAfterInitialization(可選)
(6)bean 可以使用(獲取到了對象)
(7)當容器關閉時候,調用 bean 的銷毀的方法(需要配置銷毀的方法)
后置處理器在配置后,會對所有的 Bean 生效
不含后置處理器的 Bean 生命周期演示:
public class Orders {private String oname;// 無參構造public Orders() {System.out.println("第一步 執行無參構造創建 bean 實例");}public void setOname(String oname) {this.oname = oname;System.out.println("第二步 調用 set 方法設置屬性值");}// 初始化的方法public void initMethod() {System.out.println("第三步 執行初始化的方法");}// 銷毀的方法public void destroyMethod() {System.out.println("第五步 執行銷毀的方法");} }三 IOC 的 Bean 管理(XML)
Bean 管理包含兩個步驟:創建對象、注入屬性
1 創建對象
創建對象時候,默認是執行無參數構造方法完成對象創建。
<bean id="custom_instance_name" class="pojo.MyClass"></bean>
- id:唯一標識,相當于對象名
- class:類全路徑
2 屬性注入 - 使用 set 方法
3 屬性注入 - 通過有參構造器實現
3 注入屬性為 null / 包含特殊符號
<bean id="book" class="com.atguigu.spring5.Book"><property name="address"><null/></property><property name="tel"><value><![CDATA[...]]></value></property> </bean>4 注入外部 Bean
- 示例使用 set 方法進行注入,要求 userService 實現了其 dao 屬性的 set 方法
- name 是類里面屬性名稱,ref 是創建 userDao 對象 bean 標簽 id 值
5 注入內部 Bean
- 示例使用 set 方法進行注入
- 如果注入的類型是 Bean,則將 value 標簽替換為 ref 標簽
6 注入 array / list / map / set
- 示例使用 set 方法進行注入
7 自動裝配
- 在 bean 標簽后設置屬性 autoware
- 可選參數 byName(根據屬性的名稱,自動裝配和屬性名相同的 id 的 bean 對象);byType(根據屬性類型,自動裝配 bean 對象)
8 使用外部文件配置 Bean
以 Druid 數據庫連接池的配置為例。
<!--引入 context 名稱空間--> .......<!--引入外部屬性文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置連接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${prop.driverClass}"></property><property name="url" value="${prop.url}"></property><property name="username" value="${prop.userName}"></property><property name="password" value="${prop.password}"></property> </bean>四 IOC 的 Bean 管理(注解)
使用注解的目的是簡化 xml 配置
1 Spring 針對創建 Bean 對象提供的注解
- @Component
- @Service
- @Controller
- @Repository
以上注解的功能相同,只是用于標識不同層
2 創建對象的步驟
<context:component-scan base-package="com.atguigu"></context:component-scan>
3 屬性注入 - @Autowared
- 根據屬性類型進行自動裝配
- 創建 service 和 dao 對象,在 service 和 dao 類添加對應的創建對象注解;在 service 注入 dao 對象,在 service 類添加 dao 類型屬性,在屬性上使用注解
- 不需要為注入屬性添加 set 方法
4 屬性注入 - @Qualifier
- 根據名稱注入
- 和上面的 @Autowired 一起使用,用于區別相同類型的不同 Bean
5 屬性注入 - @Resource
- 可以實現類型注入、名稱注入
- 類型注入不需要加參數,名稱注入使用 name 參數指定
6 屬性注入 - @Value
- 上述三種注入的是對象屬性,而 @Value 可以注入普通類型
7 完全注解開發
- 使用 @Configuration 注解的類,代替配置文件
- 使用 @ComponentScan(basePackages = {"..."}) 完成組件掃描
- 使用時加載配置類:ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
五 AOP 概述
Aspect Oriented Programming,面向切面編程,本質是動態代理
- 連接點:類中可以被增強的方法
- 切入點:實際增強的方法
- 通知(增強):實際增強的邏輯部分,包含 前置通知 / 后置通知 / 環繞通知 / 異常通知(增強發生異常時的邏輯) / 最終通知(增強部分類似于 finally)
- 切面:通知應用到切入點的過程
1 動態代理的兩種情況
2 JDK 動態代理實例
六 AspectJ 的使用(注解)
AspectJ 不是 Spring 的組成部分,獨立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,進行 AOP 操作
1 切入點表達式
-
用于設置增強方法(在代理類中的注解的 value 屬性
-
語法規則:execution([權限修飾符(可選)] [返回類型(可為*)] [類全路徑] [方法名稱]([參數列表]) )
舉例 1:對 com.atguigu.dao.BookDao 類里面的 add 進行增強
execution(* com.atguigu.dao.BookDao.add(…))舉例 2:對 com.atguigu.dao.BookDao 類里面的所有的方法進行增強
execution(* com.atguigu.dao.BookDao.* (…))
2 使用流程
- 被代理類與原方法
- 代理類與增強方法
- 測試過程與結果
3 相同切入點的抽取
對空方法使用注解 @Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
相同切入點的注解的 value 屬性值為 “空方法調用”
4 完全注解開發
創建配置類代替 xml
@Configuration @ComponentScan(basePackages = {"pojo"}) @EnableAspectJAutoProxy(proxyTargetClass = true) public class ConfigAop {}七 JdbcTemplate
1 配置
在 xml 中配置組件掃描 <context:component-scan base-package="jdbc"></context:component-scan>
2 添加 / 修改 / 刪除 操作
在 DAO 中調用 jdbcTemplate 的 update 方法
@Component(value = "userDAO") public class UserDAOImpl implements UserDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic void add(User user) {String sql = "insert into user values (?, ?, ?, ?, ?)";Object[] args = {user.getId(), user.getName(), user.getPwd(), user.getAddr(), user.getTel()};int update = this.jdbcTemplate.update(sql, args); // 調用 jdbcTemplate.update 進行添加System.out.println(update);} }測試方法:
@Testpublic void testAddOneItem() {User user = new User(10, "伍佰", "500", "老城路101", "554433");ApplicationContext applicationContext = new ClassPathXmlApplicationContext("myclass.xml");UserService userService = applicationContext.getBean("userService", UserService.class);userService.addUser(user);}- 如果要實現批量操作,調用 jdbcTemplate 的 batchUpdate
- batchUpdate傳入的參數1為 sql,參數2為List<Object[]> 類型,其中的每個元素 Object[] 代表一條語句的參數
3 查詢值
在 DAO 中調用 jdbcTemplate 的 queryForObject 方法
@Component(value = "userDAO") public class UserDAOImpl implements UserDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic int selectCount() {String sql = "select count(*) from user";return this.jdbcTemplate.queryForObject(sql, Integer.class);} }4 查詢單個對象
- 在 DAO 中調用 jdbcTemplate 的 queryForObject 方法
- 需要傳入 BeanPropertyRowMapper 對象,其作用是將 SQL 查詢返回值封裝為指定對象
- 默認情況下需要表屬性名和類屬性名一致
5 查詢多個對象
類似于查詢單個對象,調用的是 query 方法
@Component(value = "userDAO") public class UserDAOImpl implements UserDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic List<User> selectAll() {String sql = "select * from user";List<User> userList = this.jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));return userList;} }八 Spring 事務管理
- 底層使用了 AOP 原理
- 事務方法:更改數據庫內容的方法(增刪改)
- 在 Web - Service - DAO 三層結構中,推薦把事務注解放在 Service 層
- Spring 提供了一個事務管理器接口 PlatformTransactionManager ,這個接口針對不同的框架提供不同的實現類
1 注解聲明式事務管理的步驟
2 @Transactional 的參數配置
3 完全注解的 聲明式事務管理
@Configuration //配置類 @ComponentScan(basePackages = "com.atguigu") //組件掃描 @EnableTransactionManagement //開啟事務 public class TxConfig {//創建數據庫連接池@Beanpublic DruidDataSource getDruidDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///user_db");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}//創建JdbcTemplate對象@Beanpublic JdbcTemplate getJdbcTemplate(DataSource dataSource) {//到ioc容器中根據類型找到dataSourceJdbcTemplate jdbcTemplate = new JdbcTemplate();//注入dataSourcejdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}//創建事務管理器@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;} }總結
以上是生活随笔為你收集整理的后端学习 - Spring5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么给普通图片转换成svg格式
- 下一篇: 后端学习 - SpringMVC