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