spring 部分知识
一.spring三大核心【控制反转(IOC),依赖注入(DI)和面向切面(AOP)。】
1.ico【控制反转】
(1)介绍
IoC(控制反转)。是一种设计思想,在Java开发中,将你设计好的对象 交给容器控制,而不 是显示地用代码进行对象的创建。把创建和查找依赖对象的控制权交给 IoC 容器,由 IoC 容 器进行注入、组合对象。这样对象与对象之间是松耦合、便于测试、功能可复用(减少对象 的创建和内存消耗),使得程序的整个体系结构可维护性、灵活性、扩展性变高。
(2)使用ioc好处
(3)资源集中管理,实现资源的可配置和易管理 降低了资源的依赖程度,即松耦合
便于测试 功能可复用(减少对象的创建和内存消耗)
使得程序的整个体系结构可维护性、灵活性、扩展性变高
2.DI依赖注入
(1)DI(Dependency Injection)依赖注入,是 IoC 容器装配、注入对象的一种方式。通过依赖注入机制,简单的配置即可注入需要的资源,完成自身的业务逻辑,不需要关心资源的出处和具体实现。
(2)spring提供了三种主要的方式来配置IoC 容器中的bean 基于 XML 文件配置 基于注解配置 基于注解 + java 代码显式配置
3.作用
IoC体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应 的依赖对象并注入,而不是由对象主动去找。IoC 不是一种思想,一个重要的面向对象编程的法则,能 指导如何设计出松耦合、优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致 类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器 进行注入组合对象,所以对象与对象之间是 低耦合,这样也方便测试,利于功能复用,更重要的是使得 程序的整个体系结构变得非常灵活。其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发 生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中, 应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
4.aop
(1)Spring框架的搭建方式
1.导入相关的jar包
maven方式下只需要引入spring-context就可以导入相关的jar包
2.编写spring核心配置文件applicationContext.xml
(2)spring两大核心之IOC
IOC就是把对象的创建过程交给spring ioc容器去管理
Spring IoC容器管理一个或多个bean。这些bean是使用您提供给容器的配置元数据创建的(例如,以 XML 定义的形式 )。
Bean的初始化方式有三种 1.实例化工厂 2.静态工厂 3.构造方法
DI:就是依赖注入,在IOC容器创建对象的时候,初始化内部属性,来定义它们的依赖关系
DI存在两个主要方法:1.set方法注入,2.构造方法注入
自动装配:简化xml配置
byName:根据"set" + 属性名首字母大写去查找对应的set方法,如果找到了,则调用该方法来注入
byType:根据set方法中的类型来匹配的。
constructor:根据构造方法来实现自动装配
autowire-candidate=“false” 表示该bean不参数自动装配
在开发中我们也可以用注解的方式代替.xml文件的配置
1.@Component取代
@Component(“id”) 取代
2.web开发,提供3个@Component注解衍生注解(功能一样)取代
@Repository :dao层 @Service:service层 @Controller:web层
3.依赖注入,给私有字段设值,也可以给setter方法设值
普通值:@Value(" ")
引用值:
方式1:按照【类型】注入 @Autowired
方式2:按照【名称】注入1 @Autowired @Qualifier(“名称”)
方式3:按照【名称】注入2 @Resource(“名称”)
4.作用域
@Scope(“prototype”) 多例 !
AOP是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
Spring AOP是用纯Java实现的。不需要特殊的编译过程。Spring AOP不需要控制类加载器层次结构,因此适合在servlet容器或应用程序服务器中使用。
使用Java配置启用@AspectJ支持
要使用基于XML的配置启用@AspectJ支持,请使用该aop:aspectj-autoproxy 元素,如以下示例所示:
aop:aspectj-autoproxy/
启用@AspectJ支持后,在应用程序上下文中定义的任何bean都具有@AspectJ方面的类(具有@Aspect注释),Spring会自动检测并用于配置Spring AOP。
配置spring
<aop:config>
<!-- 切面 -->
<aop:aspect id="" ref="">
<!-- 切入点 代码块要切入到什么地方 -->
<aop:pointcut expression="execution()" id="animalPointCut"/>
<!-- 通知 before:在XXX之前 -->
<aop:before method="start" pointcut-ref="animalPointCut"/>
<!-- 通知 after:在XXX之后 -->
<aop:after method="end" pointcut-ref="animalPointCut"/>
<!-- 通知 around:在XXX周围环绕 -->
<aop:around method="around" pointcut-ref="animalPointCut"/> -->
</aop:aspect>
</aop:config>
可以用注释代替.xml文件的配置
@Before代替 aop:before
@After代替aop:after
@Around代替aop:around
使用@Around注释声明around建议。advice方法的第一个参数必须是type ProceedingJoinPoint。在建议的主体内,调用导致底层方法执行proceed()的ProceedingJoinPoint原因。该proceed方法也可以传入Object[]。数组中的值在进行时用作方法执行的参数。
访问当前 JoinPoint
任何通知方法都声明一个类型的参数作为其第一个参数 org.aspectj.lang.JoinPoint(注意,需要在通知周围声明类型的第一个参数ProceedingJoinPoint,它是一个子类JoinPoint。 JoinPoint接口提供了许多有用方法:
getArgs():返回方法参数。 getThis():返回代理对象。 getTarget():返回目标对象。
getSignature():返回正在建议的方法的描述。 toString():打印建议方法的有用说明。
AOP代理
Spring AOP默认使用AOP代理的标准JDK动态代理。这使得任何接口(或接口集)都可以被代理。
直接在对象引用上调用该方法
spring是什么:spring是j2ee应用程序的框架。是轻量级的IOC和aop的容器框架。主要针对JavaBean的生命周期进行管理的轻量级容器,可以可其他的框架进行使用(轻量级是相对于重量级EJB)
IOC:控制反转
原来:我们的service需要调用dao,service就需要创建dao,
spring:spring发现你service依赖于dao,就给你注入(也叫依赖注入DI)
核心原理:配置文件+反射(工厂也可以)+工厂模式(容器map)
2.aop面向切面编程
核心原理:
使用动态代理的方式在执行的前后或者出现异常后做相关的逻辑
我们主要使用aoplai来做
1.事务处理 2.权限判断 3.日志