前言:
Spring是Java EE编程领域的一个轻量级开源框架,方便企业开发,本文主要简析Spring的相关知识点。
14.IOC有什么优点
依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。
15.IOC(依赖注入)方式
- 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
- Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
16.Spring中注入java集合
Spring提供以下几种集合的配置元素:
<list>类型用于注入一列值,允许有相同的值。
<set>类型用于注入一列值,不允许有相同的值。
<map>类型用于注入一组键值对,<entry>键和值都可以为任意类型。
<props>类型用于注入一组键值对,键和值都只能为String类型。
17.面向切面(AOP)
1、面向切面是一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点。
2、横切关注是会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。
18.AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect
)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint
)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut
)
对连接点进行拦截的定义
5、通知(advice
)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象(Target
)
代理的目标对象
7、织入(weave
)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction
)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
19.Spring AOP的通知/增强处理类型
通知(或增强处理)是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
- before:前置通知,在一个方法执行前被调用。
- after: 在方法执行之后调用的通知,无论方法执行是否成功。
- after-returning: 仅当方法成功完成后执行的通知。
- after-throwing: 在方法抛出异常退出时执行的通知。
- around: 在方法执行之前和之后调用的通知。
20.Spring动态代理
java动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
cglib动态代理:利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
如何强制使用CGLIB实现AOP?
(1)添加CGLIBjar包
(2)在spring配置文件 <aop:config>
里面”proxy-target-class”属性设置为true
JDK动态代理和CGLIB字节码生成的区别?
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
21.Spring获取HttpSession对象的方法
Spring MVC
直接作为Controller的参数传入
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public Map test(HttpSession session, String otherParam) {
//TODO
return null;
}
其它
要获取HttpSession,只需要获取到HttpServletRequest,然后调用HttpServletRequest的getSession方法
1、注解自动注入
@Autowired
private HttpSession session;
@Autowired
private HttpServletRequest request;
2、普通类中获取
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
request.getSession();
22.ApplicationContext的实现方式
1、FileSystemXmlApplicationContext :从文件系统加载IoC配置文件
//加载单个xml文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
//加载多个xml文件
String[] locations = new String[]{"bean1.xml", "bean2.xml", "bean3.xml"};
ctx = new FileSystemXmlApplicationContext(locations);
2、ClassPathXmlApplicationContext:从文件系统加载IoC配置文件
//加载单个xml文件
ctx = new ClassPathXmlApplicationContext("bean.xml");
//加载多个xml文件
locations = new String[]{"bean1.xml", "bean2.xml", "bean3.xml"};
ctx = new ClassPathXmlApplicationContext(locations);
3、WebXmlApplicationContext:通过WebApplicationContextUtils获取
ServletContext servletContext = request.getSession().getServletContext();
ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
23.SpringBoot的优缺点
优点:
1,快速构建项目
2,对主流开发框架的无配置集成
3,项目可独立运行,无须外部依赖Servlet容器
4,提供运行时的应用监控
5,极大地提高了开发效率,部署效率
6,与云计算的天然集成
7,使编码,配置,部署,监控变得更简单
缺点:
集成度较高,使用过程中不太容易了解底层
因为不要自己做配置,项目有的时候会报错,不容易解决
24.Spring-涉及到的设计模式
1. 简单工厂
又叫做静态工厂方法(StaticFactory Method)模式。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
2. 工厂方法(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
Spring中的FactoryBean就是典型的工厂方法模式。
3. 单例(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。
4. 适配器(Adapter)
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Spring Sop中,由于Advisor链需要的是MethodInterceptor(拦截器)对象,所以每一个Advisor中的Advice都要适配成对应的MethodInterceptor对象。
5.包装器(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
6. 代理(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。
从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。
Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
7.观察者(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
8.模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。例如Spring中的JdbcTemplate。