[ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)
一、Spring的Bean管理(注解方式)
1.1 什么是注解
要使用注解方式实现Spring的Bean管理,首先要明白什么是注解。通俗地讲,注解就是代码里的特殊标记,使用注解可以完成相应功能。
注解的写法:@注解名称(属性名称=属性值)。
注解的用法:可以使用在类上、方法上和属性上。
1.2 注解开发准备工作
● 导入jar包,其中包括基本jar包和aop相关的jar包,如下图:
● 引入相关约束(除了第一节学习中用到的beans约束,还要加入新的约束),如下:
- <?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-context.xsd" >
1.3 编写相关的测试类
- package com.Kevin.anno;
- import org.springframework.stereotype.Component;
- /**
- * 使用注解方式在service中调用dao方法
- * @author Kevin
- *
- */
- @Component("userDao") //value属性名称可以省略不写
- public class UserDao {
- public void add(){
- System.out.println("Dao------");
- }
- }
1.4 在配置文件中配置注解扫描
- <!-- 开启注解扫描
- 到对应的包里扫描 类、属性、方法上的注解
- -->
- <context:component-scan base-package="com.Kevin.anno"></context:component-scan>
1.5 在相关的类上添加注解
- package com.Kevin.anno;
- import javax.annotation.Resource;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- /**
- * 使用注解方式在service中调用dao方法
- * @author Kevin
- *
- */
- @Service("userService")
- public class UserService {
- //得到dao对象
- //1.定义dao类型属性
- //在dao属性上使用注解完成对象注入
- //@Autowired
- //name属性值填写 注解创建dao对象的value值
- @Resource(name="userDao")
- private UserDao userDao;
- public void add(){
- System.out.println("Service------");
- userDao.add();
- }
- }
1.6 编写测试类进行测试:
- package com.Kevin.anno;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 测试注解创建类对象
- * @author Kevin
- *
- */
- public class TestAnno {
- @Test
- public void testService(){
- ApplicationContext context=new ClassPathXmlApplicationContext("beans1.xml");
- UserService service=(UserService) context.getBean("userService");
- System.out.println(service);
- service.add();
- }
- }
二、Spring的Bean管理中常用的注解
2.1 Component组件(作用在类上)
Spring 中提供@Component 的三个衍生注解:(功能目前来讲是一致的)
● @Controller:WEB 层
● @Service:业务层
● @Repository:持久层
这三个注解是为了让标注类本身的用途清晰,Spring 在后续版本会对其增强
2.2 属性注入的注解(使用注解注入的方式,可以不用提供set方法)
● @Value:用于注入普通类型。
● @Autowired:自动装配:
①按默认类型进行装配
②按名称注入:@Qualifier:强制使用名称注入。
● @Resource:相当于@Autowired和@Qualifier一起使用。
2.3 Bean的作用范围的注解
● @Scope:
* singleton:单例
* prototype:多例
2.4 Bean的生命周期的配置
● @PostConstruct:相当于init-method。
● @PreDestroy:相当于destroy-method。
三、Spring的Bean管理方式的比较
XML和注解比较:
● XML:结构清晰.
● 注解:开发方便.(属性注入.)
实际开发中还有一种 XML 和注解整合开发:
● Bean 有 XML 配置,是使用的属性使用注解注入。
四、AOP的概述
4.1 什么是AOP
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
4.2 为什么学习AOP
面向切面编程,扩展功能不通过源代码修改。AOP采取横向抽取机制,取代了传统的纵向继承体系重复性代码。
4.3 Spring的AOP的由来
AOP 最早由 AOP 联盟的组织提出的,制定了一套规范.Spring 将 AOP 思想引入到框架中,必须遵守 AOP 联盟的规范。
4.4 AOP的底层实现
代理机制:
● Spring 的 AOP 的底层用到两种代理机制:
● JDK 的动态代理 :针对实现了接口的类产生代理.
● Cglib 的动态代理:针对没有实现接口的类产生代理. 应用的是底层的字节码增强的技术 生成当前类的子类对象.
五、Spring底层AOP
六、Spring 的基于 AspectJ 的 AOP 开发
6.1 AOP开发中相关的术语
● Pointcut:切入点,在类中有很多方法可以被增强,而只有实际增强的方法称为切入点;
● Advice:通知/增强,实际增强的逻辑,被称为通知/增强,比如拓展日志功能,日志功能被称为通知/增强;
前置通知:在方法之前执行
后置通知:在方法之后执行
异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:在方法之前和之后执行
● Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field;
● Target(目标对象):代理的目标对象;
● Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程(spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入);
● Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类。
● Aspect:切面,将增强应用到具体方法上的过程称为切面(把增强用到切入点过程)
● Joinpoint:连接点,类里面可以被增强的方法,被称为连接点
七、Spring 使用 AspectJ 进行 AOP 的开发:XML 的方式
7.1 编写被增强类
- package com.Kevin.aop;
- /**
- * AOP操作被增强类
- * @author Kevin
- *
- */
- public class Book {
- public void add(){
- System.out.println("Bookadd-----");
- }
- }
7.2 编写增强类
- package com.Kevin.aop;
- import org.aspectj.lang.ProceedingJoinPoint;
- /**
- * AOP操作增强类
- * 前值增强
- * @author Kevin
- *
- */
- public class StrBook {
- public void strbefore(){
- System.out.println("Before Strength BookClass---");
- }
- public void strafter(){
- System.out.println("Atfer Strentgh BookClass---");
- }
- //环绕增强
- public void straround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
- //方法之前
- System.out.println("Before around---");
- //执行被增强方法
- proceedingJoinPoint.proceed();
- //方法之后
- System.out.println("After around---");
- }
- }
7.3 编写测试代码
- package com.Kevin.aop;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class TestUsage {
- //AOP前置增强
- @Test
- public void test(){
- ApplicationContext context=new ClassPathXmlApplicationContext("beans3.xml");
- Book book=(Book) context.getBean("book");
- book.add();
- }
- }
八、Spring 的Bean管理:XML+注解 的方式实现
8.1 使用注解方式注入对象
创建BookDao和OrdersDao两个类,在BookService中使用注解的方式注入两个dao。
- package com.Kevin.XMLanno;
- /**
- * 配置文件和注解混合使用
- * 创建对象操作使用配置文件方式实现
- 注入属性的操作使用注解方式实现
- * @author Kevin
- *
- */
- public class BookDao {
- public void book(){
- System.out.println("BookDao----");
- }
- }
- package com.Kevin.XMLanno;
- /**
- * 配置文件和注解混合使用
- * 创建对象操作使用配置文件方式实现
- 注入属性的操作使用注解方式实现
- * @author Kevin
- *
- */
- public class OrdersDao {
- public void buy(){
- System.out.println("OrdersDao----");
- }
- }
- package com.Kevin.XMLanno;
- import javax.annotation.Resource;
- /**
- * 配置文件和注解混合使用
- * 创建对象操作使用配置文件方式实现
- 注入属性的操作使用注解方式实现
- * @author Kevin
- *
- */
- public class BookService {
- //得到BookDao和OrdersDao的对象
- @Resource(name="bookDao")
- private BookDao bookDao;
- @Resource(name="ordersDao")
- private OrdersDao ordersDao;
- public void add(){
- System.out.println("BookService----");
- bookDao.book();
- ordersDao.buy();
- }
- }
8.2 用xml配置文件的形式创建对象
- <?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-context.xsd"> <!-- bean definitions here -->
- <!-- 开启注解扫描
- 到对应的包里扫描 类、属性、方法上的注解
- -->
- <context:component-scan base-package="com.Kevin.XMLanno"></context:component-scan>
- <!-- 配置对象 -->
- <bean id="bookService" class="com.Kevin.XMLanno.BookService"></bean>
- <bean id="ordersDao" class="com.Kevin.XMLanno.OrdersDao"></bean>
- <bean id="bookDao" class="com.Kevin.XMLanno.BookDao"></bean>
- </beans>
[ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)的更多相关文章
- SSH 之 Spring的源码(二)——Bean实例化
首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. <span ...
- [转]Spring Security学习总结二
原文链接: http://www.blogjava.net/redhatlinux/archive/2008/08/20/223148.html http://www.blogjava.net/red ...
- Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客
==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...
- [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)
一.Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" ...
- Java框架spring Boot学习笔记(六):Spring Boot事务管理
SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.
- 开源框架.netCore DncZeus学习(二)配置连接
配置连接字符串,update-database,初始数据后,访问报错,提示offset错误.因为本机上使用的sql2008. .net Core 2.X中的EF访问sqlserver2008默认使用的 ...
- spring MVC学习之二
什么是Spring MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MV ...
- Spring Boot学习笔记二
Spring Boot入门第二篇 第一天的详见:https://www.cnblogs.com/LBJLAKERS/p/12001253.html 同样是新建一个pring Initializer快速 ...
- [ SSH框架 ] Spring框架学习之一
一.Spring概述 1.1 什么是Spring Spring是一个开源框架, Spring是于2003年兴起的一个轻量级的Java开发框架,由 Rod Johnson在其著作 Expert One- ...
随机推荐
- TCP的核心系列 — SACK和DSACK的实现(六)
上篇文章中我们主要说明如何skip到一个SACK块对应的开始段,如何walk这个SACK块包含的段,而没有涉及到 如何标志一个段的记分牌.37版本把给一个段打标志的内容独立出来,这就是tcp_sack ...
- objective-c如何在linux下进入Modern模式
自从apple的obj-c进入2.0后,出现了相对于Legacy模式的Modern模式:Modern模式中出现了一些高级功能(比如ARC),并且出现了一些新的字面语法,新旧模式的差别可以参考apple ...
- Linux文件系统及常用命令
Linux文件系统介绍: 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上.目录提供了管理文件的一个方便而有效的途径. Linux使用树状目录结 ...
- 初探linux子系统集之led子系统(二)
巴西世界杯,德国7比1东道主,那个惨不忍睹啊,早上起来看新闻,第一眼看到7:1还以为点球也能踢成这样,后来想想,点球对多嘛6比1啊,接着就是各种新闻铺天盖地的来了.其实失败并没有什么,人生若是能够成功 ...
- javascript中的in运算符
in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望他的又操作数是一个对象:如果右侧对象拥有一个名为左操作数值的属性名,那么表达式返回true: var point = {x:1,y:1}; ...
- Demo2
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Angular v6 正式发布
Angular 6 正式发布 Angular 6 已经正式发布了!这个主要版本并不关注于底层的框架,更多地关注于工具链,以及使 Angular 在未来更容易快速推进. 作为发布的一部分,我们同步了主要 ...
- HP-Socket快速入门:分包、粘包解析
环境配置 vs2015 windows7 64位 hp-socket 5.0 安装hp-socket 新建控制台项目TelnetServer,打开Nuget管理工具,搜索hp-socket: 安装成功 ...
- Visual Studio 2013创建自定义多项目模版
首先附上效果图: 可以看到输入解决方案名称后,自动创建了我事先写好的架构,并且项目名及Server层名称都变了,并且依然保持了引用关系. 下面讲具体步骤: 第一步:建立解决方案,并将需要的代码全部写好 ...
- FFPLAY的原理(七)
同步音频 现在我们已经有了一个比较像样的播放器.所以让我们看一下还有哪些零碎的东西没处理.上次,我们掩饰了一点同步问题,也就是同步音频到视频而不是其它的同 步方式.我们将采用和视频一样的方式:做一个内 ...