spring(2)

本贴最后更新于 2277 天前,其中的信息可能已经水流花落

1、注解开发实现 ioc 以及 DI 注入
1)注解实现 ioc
需要导入 aop 的坐标
<context:component-scan base-package="cn.itcast.spring.demo8"/> 扫描包下所有带有组件注解的类
@Component 等价于 @Controller(web)等价于 @Service(service)等价于 @Repository(dao) 表明当前类是组件类

2)注解实现di
	@Value("张三") 直接给普通类型去赋值,掌握,后面会结合properties文件来使用
	@Autowired+@Qualifier=@Resource(jdk自带) 		
	注意:使用注解实现di的时候,引用类型也要交给spring管理

3)spring和junit4集成的测试
	@RunWith(SpringJUnit4ClassRunner.class)// spring整合junit4
	@ContextConfiguration(locations = "classpath:applicationContext.xml")   

4)通过xml和注解能不能混合使用?是可以的
	总结xml和注解混搭DI注意点
	第一种:applicationContext.xml
	<bean id="b" class="cn.itheima.test.di2.B"/>
	<bean id="a" class="cn.itheima.test.di2.A">
		<property name="b" ref="b"></property> 
	</bean>
	A类中
	private B b;
	public void setB(B b) {
		this.b = b;
	}

	第二种:applicationContext.xml
	<bean id="b" class="cn.itheima.test.di2.B"/>
	<bean id="a" class="cn.itheima.test.di2.A">
	</bean>
	在A类中
	@Autowired
	private B b;   
	
	第三种:applicationContext.xml开启注解的扫描
	<context:component-scan base-package="cn.itheima.test.di2"></context:component-scan>
	@Component
	public class B {
	}
	@Component
	public class A {
		@Autowired
		private B b;
	}

	注意:
	A对象由spring容器创建,依赖B对象,B不被spring容器管理,A依赖注入B时,会报错
	A对象手动new出来,依赖B对象,B被spring容器管理,A依赖注入B时,注入的B为null

1、aop 面向切面编程介绍
增强类 目标类
A {
 a(公共的逻辑)
 b(业务逻辑)
 c(公共的逻辑)

当一个方法中执行需要先后执行a,b,c逻辑的时候,我们能不能把a,c逻辑放在一个类中,
给其他类共用?能不能动态组合a+b+c逻辑,这就是面向切面编程思想的来源

底层使用动态代理:jdk和cglib,目标对象有接口,优先采用jdk,没有接口则采用cglib
1)jdk实现动态代理(基于接口实现代理对象)
	接口   CustomerService 
	实现类 CustomerServiceImpl  目标类
	代理类 CustomerProxy  目标对象的方法执行前后都可以增强
	
	实现类与代理类,兄弟关系

2)cglib实现动态代理(Spring提供,基于继承父类而实现代理对象,代理对象继承目标对象)
	实现类 CustomerServiceImpl  目标类
	代理类 CustomerProxy  目标对象的方法执行前后都可以增强
	
	实现类(父)与代理类(子),父子关系
总结:spring默认采用jdk动态代理,一个类,有接口,优先使用jdk;
      无接口,通过配置proxy-target-class="true"采用cglib
	  

2、aop 各种概念介绍
1)核心概念:
(1)目标类(target): 要被增强的类
(2)代理类(proxy): 使用动态代理产生目标类的代理
(3)切入点(pointcut):目标类中需要增强的方法,这些方法都称为切入点
(4)通知(advice): 增强类中定义的方法,这些方法用于增强目标方法
(5)切面(aspect): 切入点 + 通知

2)其他概念:
	(1)连接点(joinpoint):目标类中的所有方法    连接点包含切入点
	(2)织入(weaving): 将通知方法加到目标方法中的过程  spring aop整个过程就是织入
	(3)引入(introduction): 在目标类引入新的属性或者新的方法  了解一下就行	 

3、aop 之 aspectj 各种通知
前置通知 before 目标方法被调用之前,就执行该前置通知方法
后置通知 after-returning 目标方法 return 返回之后,就执行该返回通知方法
最终通知 after 目标方法被调用完之后,不关心返回结果,就执行该最终通知方法
环绕通知 around 包裹了目标方法,在目标方法之前和在目标方法之后整个过程,经常使用 ProceedJoinPoint.proceed()来执行目标方法
异常通知 after-throwing 当目标方法在执行异常的时候,就会执行该异常通知方法

4、切入点表达式,execution(表达式) within
表达式完整格式:访问修饰符 返回类型 包名.类名.方法名(方法参数) 注意这里的访问修饰符可省略
* .(..) 匹配所有类所有方法 (第一个代表返回类型)
* (..) 匹配所有类所有方法
* cn.itcast.User.
(..) 匹配 User 类下面的所有方法
* cn.itcast..
.*(..) 匹配 itcast 包下所有子包下的所有方法
实际开发中,根据情况改变切入点表达式的包和方法

5、总结两种方式实现 AOP 编程
xml 方式
目标类 连接点 切入点
代理类 通知
切面=切入点 + 通知

	目标类
	<bean id="a"  class="xxx.A"/>
	
	代理类
	<bean id="b"  class="xxx.B"/>
	
	<aop:config>
		切入点
		<aop:pointcut id="pointcut1" expression="execution(* cn.itcast.service.*.add*(..))" />
		
		<aop:aspect ref="b">
			<aop:before pointcut-ref="pointcut1" method="aaa" />
			<aop:after-returning pointcut-ref="pointcut2" method="bbb" />
			<aop:aroud pointcut-ref="pointcut3" method="ccc" />
			<aop:after-throwing pointcut-ref="pointcut4" method="ddd" />
			<aop:after pointcut-ref="pointcut5" method="eee" />
		</aop:aspect>
	</aop:config>

注解方式
	目标类  连接点  切入点
	代理类  通知
	切面=切入点+通知
	
	applicationContext.xml
	<context:component-scan base-package="cn.itcast.spring.demo4"/>
    <aop:aspectj-autoproxy/>
	
	目标类
	@Component  @Controller @Service @Repository
	
	代理类
	@Component  @Aspect
	
	@Before(value="execution(* cn.itcast.service.*.add*(..))")
	public void a(JoinPoint jp) {
	
	}
	
	@AfterReturning(value="execution(* cn.itcast.service.*.delete*(..))",returning="abc")
	public void b(JoinPoint jp,Object abc) {
	
	}
	
	@Around(value="execution(* cn.itcast.service.*.update*(..))")
	public void c(ProceedingJoinPoint pjp) {
	
	}
	
	@AfterThrowing(value="execution(* cn.itcast.service.*.find*(..))",throwing="throwable")
	public void d(Throwable throwable) {
	
	}
	
	@After(value="execution(* cn.itcast.service.*.batch*(..))")
	public void e(JoinPoint jp) {
	
	}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 996
    13 引用 • 200 回帖 • 11 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8447 引用 • 38477 回帖 • 154 关注
  • danl
    146 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 102 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 105 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    409 引用 • 1246 回帖 • 587 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    126 引用 • 169 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1273 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    7 引用 • 40 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    178 引用 • 997 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 789 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 163 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1520 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 14 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 637 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 86 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 76 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖