写点什么

JavaEE 框架学习笔记——Spring 篇

  • 2021 年 11 月 11 日
  • 本文字数:5680 字

    阅读完需:约 19 分钟

11、AspectJ——AOP框架


12、AspectJ基于xml的使用


13、AspectJ基于注解的使用



1、IoC 控制反转的概念

Inverse of Control?反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架管理,简单说,就是创建********对象控制权被反转到了 Spring 框架。

2、DI 依赖注入

Dependency Injection 依赖注入,在 Spring 框架负责创建 Bean 对象时,动态的将依赖对象注入到 Bean 组件。如下例子


在 UserService 中提供一个 get/set 的 name 方法,在 beans.xml 中通过 property 去注入。


<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><td><p style="text-align:center;"><img alt="" height="406" src="https://img-blog.csdnimg.cn/2020031616142769.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70" width="600"></p><p> </p></td></tr><tr><td><p style="text-align:center;"><img alt="" height="264" src="https://img-blog.csdnimg.cn/20200316161453319.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70" width="600"></p><p> </p></td></tr></tbody></table>

3、加载 Spring 容器的三种方式?

<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>类路径获得配置文件(常用)</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" height="112" src="https://img-blog.csdnimg.cn/20200316163600119.png" width="1068"></p><p> </p></td></tr><tr><td><p><span style="color:#f33b45;"><strong>文件系统路径获得配置文件</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" height="124" src="https://img-blog.csdnimg.cn/20200316163654565.png" width="1200"></p><p> </p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>使用 BeanFactory(过时)</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200316163759306.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr></tbody></table>

4、bean 的作用域

<table border="1" cellspacing="0" style="width:700px;"><tbody><tr><td style="width:104.4pt;"><p style="margin-left:0pt;">类别</p></td><td style="width:322.45pt;"><p style="margin-left:0pt;">说明</p></td></tr><tr><td style="vertical-align:top;width:104.4pt;"><p style="margin-left:0pt;"><strong><span style="color:#ff0000;"><strong>singleton</strong></span></strong></p></td><td style="vertical-align:top;width:322.45pt;"><p style="margin-left:0pt;">在 Spring IoC 容器中仅存在一个 Bean 实例,Bean 以单例方式存在,默认值</p></td></tr><tr><td style="vertical-align:top;width:104.4pt;"><p style="margin-left:0pt;"><strong><span style="color:#ff0000;"><strong>prototype</strong></span></strong></p></td><td style="vertical-align:top;width:322.45pt;"><p style="margin-left:0pt;">每次从容器中调用 Bean 时,都返回一个新的实例,即每次调用 getBean()时 ,相当于执行 new XxxBean()</p></td></tr></tbody></table>


<table border="1" cellpadding="1" cellspacing="1" style="width:700px;"><tbody><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200316165515316.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200316165527900.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr></tbody></table>

5、@Component 注解

**注解:**就是一个类,使用 @注解名称,使用注解可以取代 xml 配置文件。


@component 注解可取代 xml 文件中 bean 的配置。


@component 取代<bean class="">


**@component("id")**取代 <bean id="" class="">


<table align="center" border="1" cellpadding="1" cellspacing="1" style="width:500px;"><caption><strong>web 开发,提供 3 个 @Component 注解衍生注解</strong></caption><tbody><tr><td style="text-align:center;"><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@Repository(“名称”)</strong></span></p></td><td><p style="margin-left:0pt;">dao 层</p></td></tr><tr><td><p style="margin-left:0pt;"><strong><span style="color:#f33b45;">@Service(“名称”)</span></strong></p></td><td><p style="margin-left:0pt;">service 层</p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@Controller(“名称”)</strong></span></p></td><td><p style="margin-left:0pt;">web 层</p></td></tr></tbody></table>


<table align="center" border="1" cellpadding="1" cellspacing="1" style="width:500px;"><caption><strong>其余注解</strong></caption><tbody><tr><td style="text-align:center;"><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@Autowired</strong></span></p></td><td><p style="margin-left:0pt;">自动根据类型注入</p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@Qualifier(“名称”)</strong></span></p></td><td><p style="margin-left:0pt;">指定自动注入的 id 名称</p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@Resource(name=“名称”)</strong></span></p></td><td><p style="margin-left:0pt;">等效前两个注解</p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@ PostConstruct</strong></span></p></td><td><p style="margin-left:0pt;">自定义初始化</p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>@ PreDestroy</strong></span></p></td><td><p style="margin-left:0pt;">自定义销毁</p></td></tr></tbody></table>


举例:


<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><td><span style="color:#f33b45;"><strong>开启注解</strong></span></td></tr><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200316200611214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr><tr><td><span style="color:#f33b45;"><strong>引用注解</strong></span></td></tr><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200316200638621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr></tbody></table>

6、AOP 概述

  1. AOP 为 Aspect Oriented Programming****的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

  2. AOP 是 Spring 框架中的一个重要内容,是函数式编程的一种衍生范型。

  3. 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

  4. AOP 采取横向抽取机制,取代了传统纵向继承体系重复性代码。

  5. 经典应用:事务管理、性能监视、安全检查、缓存 、日志等。

  6. AOP 实现原理:AOP 底层采用代理机制进行实现,spring 采用 jdk 的动态代理 Proxy ?cglib 字节码增强**。**

7、AOP 术语

  1. ****target:****目标类,需要被代理的类。例如:UserService

  2. Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法

  3. PointCut?切入点:已经被增强的连接点。例如:addUser()

  4. advice 通知/增强增强代码。例如:after、before

  5. Weaving(织入):是指把增强 advice 应用到目标对象 target 来创建新的代理对象 proxy 的过程.

  6. proxy 代理类

  7. Aspect(切面): 是切入点 pointcut 和通知 advice 的结合


一个切入点和一个通知,组成成一个特殊的面。


8、JDK 动态代理和 cglib 增强字节码的区别

JDK 动态代理只能用于有接口的实现类,而 cglib 增强字节码既可以用于有接口的实现类,也可以用于没有接口的类**。**

9、Spring 半自动代理(******JDK 动态代理、******cglib 增强字节码)

<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><td colspan="2"><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>第一步:导 Jar 包</strong></span></p></td></tr><tr><td colspan="2"><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200317174746492.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr><tr><td colspan="2"><p><span style="color:#f33b45;"><strong>第二步:目标类</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" height="148" src="https://img-blog.csdnimg.cn/20200317174826244.png" width="400"></p><p> </p></td><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200317174843319.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70" width="400"></p><p> </p></td></tr><tr><td colspan="2"><p><span style="color:#f33b45;"><strong>第三步:切面类</strong></span></p></td></tr><tr><td colspan="2"><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200317174905899.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr><tr><td colspan="2"><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>第四步:spring 配置</strong></span></p></td></tr><tr><td colspan="2"><p style="text-align:center;"><img alt="" height="387" src="https://img-blog.csdnimg.cn/20200317174922864.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70" width="600"></p><p> </p></td></tr><tr><td colspan="2"><p><span style="color:#f33b45;"><strong>第五步:测试</strong></span></p></td></tr><tr><td colspan="2"><p style="text-align:center;"><img alt="" height="196" src="https://img-blog.csdnimg.cn/20200317174934622.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70" width="600"></p><p> </p></td></tr></tbody></table>


注:Spring 配置中<property name="optimize" value="true"></property>代表使用的是 cglib 增强字节码代理,注释掉则使用 JDK 动态代理。

10、Spring 全自动代理(******JDK 动态代理、******cglib 增强字节码)

<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>第一步:导入 jar 包</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200317175615990.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p></td></tr><tr><td><p><span style="color:#f33b45;"><strong>第二步:Spring 的 AOP 配置</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" height="350" src="https://img-blog.csdnimg.cn/20200317175626861.png?x-oss-process=image/watermark,t


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ype_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70" width="600"></p></td></tr><tr><td><p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>第三步:测试</strong></span></p></td></tr><tr><td><p style="text-align:center;"><img alt="" src="https://img-blog.csdnimg.cn/20200317175638743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2gyNTAzNjUyNjQ2,size_16,color_FFFFFF,t_70"></p><p> </p></td></tr></tbody></table>

评论

发布
暂无评论
JavaEE框架学习笔记——Spring篇