什么是Spring?
Spring是一个支持快速开发Java EE应用程序的框架。它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备。
IOC的技术实现
1.DL 依赖查找
2.DI 依赖注入 你在代码中只需提供要使用的对象名称,对象如何创建、赋值。从容器中获取都是容器自己完成的
Spring框架使用DI,实现对象的管理,Sping的底层是反射机制
关于Resourcea下applicatonContext.xml中的前置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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
一定要按照如下格式
在applicatonContext.xml中
设值注入跟类有无这个属性无关,只需类中有这个set方法即可
property 代表的是方法属性 name代表的是set方法后的名字 value代表的是值
constructor-arg 代表的是构造方法 index代表的是构造参数的位置 value代表的是值
autowire 代表的是自动注入 Spring会根据byname去匹配引用的对象
scope代表的作用域
1、singleton 作用域
当一个bean的 作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把 一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都 将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中 只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时 候,spring的IOC容器中只会存在一个该bean。
2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
Component-scan工作方式:spring会扫描遍历base-package指定的包,把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值
@Component 创建对象,等同于<bean>功能
@Component和@Bean的区别
https://www.cnblogs.com/zoe-java/p/11542484.html
Spring中和@Component功能一直,创建对象的注解还有:
1.@Repository (用在持久层类的上面):放在dao的实现类上面,表示创建dao对象,dao对象是访问数据库的
2.@Service(用在业务层类的上面):放在service的实现类上面,创建service对象,service对象是做业务处理,可以有事务等功能
3.@Controller(用在控制器上面):放在控制器(处理器)类的上面,创建控制器对象的,控制器对象,能够接受用户提交的参数,显示请求的处理结果
以上三个注解的语法和Compoent一样的,都能创建对象,但是这个三个注解还有额外的功能
@Autowired :spring框架提供的注解,实现引用类型的赋值
spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byType,byNmae
Autowired:默认使用的是byType的自动注入
@Resource : jdk中的注解,使用自动注入给引用变量赋值,支持byType,byNmae,默认是byName
注解的使用步骤
1.加入依赖:spring-context ,间接加入spring-aop
2.在类中加入注解
3.在spring的配置文件中,加入组件扫描器
<context:component-scan base-package="anno"/>
Ioc能实现业务对象之间的解耦合,例如service和dao 之间的解耦合
Aop的作用
1.在目标类不修改源代码的情况下,增加功能
2.减少重复代码
3.专注业务功能的实现
4.解耦合:业务功能和日志,事务这些非业务功能的耦合
什么时候考虑使用AOP技术
1.当你要给一个系统中存在的类修改功能,但是原有类的功能不完善,但是你还有源代码,使用aop功能
2.你要给项目中的多个类,增加一个相同的功能,使用aop
aop的实现框架
1.spring实现了aop,实现方式是接口
2.aspect框架(1.使用注解可以实现aop的功能 2.使用xml配置文件中的标签实现aop功能)
3.aop中概念(1.aspect:切面,表示给业务方法增加的功能,一般日志输出,事务,权限检查是切面 2.pointcut切入点,是一个或多个joinpoint的集合,表示切面执行的位置)
4.advice:通知,也叫增强,表示切面执行的时间,在方法前,方法后等等
aspect框架框架的使用
1.表示切面的执行时间,使用的通知注解--Before前置通知,在目标方法之前执行切面的功能
xml中按如下格式
<aop:config> <aop:aspect ref="myAspect"> <aop:pointcut id="aa" expression="execution( * do*())" /> <aop:before method="Before" pointcut-ref="aa" /> </aop:aspect> </aop:config> 其中myAspect表示的是声明的切面类的对象
2.表示切面位置的切入点表达式:execution(访问修饰符 返回值 包名,类名,方法名称(方法的参数) 异常)
3.
切面中常见切面的表达式