spring
1.优点
1)针对接口编程,解耦合
2)aop:变向切面编程,动态增加功能
3)方便集成框架,mybatis,hibernate,strust等
4)降低j2ee接口的使用难度
2.spring是干什么的
管理bean及bean的依赖关系的一个容器,为降低bean之间耦合度问题而开发,核心是控制反转(IOC)和面向切面编程(AOP)
控制反转(IOC:):对象的创建交给容器来完成
面向切面编程(AOP):系统级服务和主业务逻辑分开,降低耦合度,使系统级服务织入主业务逻辑
IOC:
3.(配置式开发)spring容器都干了什么
读取配置文件
创建bean对象(使用反射机制调用无参构造方法),将对象保存在内存Map中
给有依赖关系的对象赋值
4.spring容器的实现接口有哪些
ApplicationContext:创建容器时就创建了bean对象,并将对象放到内存中
BeanFactory:创建容器对象时不创建bean对象(懒加载模式:用的时候才创建)
5.spring框架中bean对象的创建过程,有几种创建方式
在配置文件中使用bean标签注册bean对象
2种方式:
默认创建方式:调用bean对象的无参构造方法
(实例)工厂模式创建bean:需要在配置文件中注册工厂对象以及注册工厂对象的方法(此方式耦合度高,因为实例工厂中写死了Java对象)
6.什么是工厂模式,什么时候用工厂模式
工厂模式:当创建对象时若比较繁琐,可以将这些繁琐的创建过程封装到一个方法中,调用此方法来创建对象,这就是工厂模式
什么时候用:创建复杂对象时
7.spring框架中bean的作用域
在配置文件中,使用scope关键子给bean指定作用域
spring支持5种作用域:singleton(单例作用域,spring默认的作用域)、prototype(原型作用域:每创建一次都是新的对象)、request、session、globalSession
8.spring中给bean对象的属性赋值(也叫注入)
对bean对象属性赋值同样是由容器完成的
根据注入方式不同分为2种:
设值注入:调用bean对象的set方法给属性赋值(常用)
构造注入:调用bean对象的构造方法时给属性赋值并创建对象(不常用)
根据注入的实现方式不同也分2种:
1.基于配置文件:(掌握,内容较多,不常用)
2.基于注解:(掌握,常用)
9.注解式开发bean对象的创建,创建前需要做什么
在配置文件中使用context:component-scan标签注册组件扫描器
多个包下都使用了注解怎么解决:
1.使用多次context:component-scan标签
2.base-package值中使用逗号或分号分隔(推荐使用此方法)
3.指定父包(不推荐使用)
10.基于注解方式开发,创建bean对象有哪些注解,怎么用
以下注解均是用于创建对象:
@Repository:用在Dao层的类上
@Service:用在Service层的类上
@Controller:用在UI层的类上
@Component:以上三个注解都不能使用或者不合格使用时就使用此注解,不使用value属性时,对象的名称默认是类名的首字母小写
11.基于注解方式开发,设置bean对象的作用域
使用@Scope注解,在value值中设置
12.基于注解方式开发,给bean对象赋值有哪些注解,怎么用
以下注解均是用于给属性赋值:
@Value:给简单类型属性赋值,可以放在属性定义上(不需要set方法的),可以放在属性的set方法上
@Autowired:spring框架中的。给引用类型的属性赋值,默认是按类型注入的。若按名称来注入需同时使用@Qualifier(value="BeanID")注解
Autowired有一个属性required,默认为true,意思是必须成功给引用类型赋值,否则程序终止并报错。若为false意思是不能成功赋值则为null
@Resource:不是spring框架中的,是jdk中的。给引用类型的属性赋值,默认是按类型注入的。若按名称来注入需要使用@Resource注解的name属性,name属性指定BeanID
给属性赋值一般是设值注入,不使用构造注入。
13.bean对象的生命始末
基于配置文件:在bean标签中使用属性init-method、destroy-method
基于注解方式:在方法上使用@PostConstruct(bean对象初始化后执行)、@PreDestroy(bean对象销毁之前执行)
14.spring框架中配置文件和注解同时使用,谁的优先级高
配置文件的优先级高
15.spring框架中配置文件和注解的优缺点
配置文件:(灵活)对其所作的修改无需编译代码,只需重启服务器即可
注解:(高效)配置方便,直观,但修改代码后需重新编译
AOP:
16.什么是代理模式,什么时候用代理模式
代理模式:为目标对象提供代理服务,从而控制对目标对象的访问及对目标对象的功能增强
什么时候用:当访问一个目标对象时达不到想要的效果,可以访问代理对象,代理对象可以对其进行访问控制及功能增强
代理模式的作用:功能增强(对目标对象目标方法的返回值做处理)和控制访问(比如控制在某些条件下可以调用目标对象的方法,某些条件下不能调用)
代理模式的分类:
静态代理:代理对象在程序运行前就已经定义好了,其与目标对象的关系在程序运行前就已经确立了
动态代理:目标对象的代理对象是由代理生成工具在程序运行时由JVM通过反射机制动态生成的,代理对象与目标对象的关系也是在程序运行时才确定的
jdk动态代理:
1.目标对象实现接口方法(有了目标对象、目标方法)(jdk动态代理要求目标对象要实现接口)
2.实现InvocationHandler接口创建调用处理器类,并且实现invoke方法(调用处理器的作用是截取对目标方法的调用)
public Object invoke(Object proxy,Method method, Object[] args)
Object proxy:代理对象
Method method:目标方法
Object[] args:目标方法的参数
返回值Object:目标方法的返回值
3.通过Proxy接口的newProxyInstance方法创建代理对象
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
ClassLoader loader:目标对象的类加载器(target.getClass().getClassLoader())
Class[] interfaces:目标对象的接口(target.getClass().getInterfaces())
InvocationHandler h:调用处理器
4.通过代理对象调用目标方法
cjlib动态代理:(当目标对象没有实现接口时可以使用cglig动态代理)cglib动态代理原理是生成目标对象的子类(继承过来的),对子类进行增强,子类即是代理对象(cglib动态代理要求目标类不能是final的)
1.导入cglib库
2.创建目标对象(不需要实现接口,且不能是final修饰的)
3.实现MethodInterceptor接口创建调用处理器,并且实现intercept方法(相当于cglib中的invoke方法)
public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy)
Object proxy:代理对象
Method method:目标方法
Object[] objects:目标方法的参数
MethodProxy methodProxy:方法的代理对象(与cglib的区别)
返回值object:目标方法的返回值
4.通过Enhancer(增强器)类创建代理对象
Enhancer enhancer = new Enhancer();
// 设置enhancer对象的父类
enhancer.setSuperclass(target.class);
// 设置enhancer的回调对象
enhancer.setCallback(new MyMethodInterceptor());
// 创建代理对象
ProxyObject proxy= (ProxyObject)enhancer.create();
5.通过代理对象调用目标方法
17.什么是AOP
面向切面编程,动态的将与主业务逻辑无关的代码(如事务、日志等)织入到主业务逻辑当中,代码上不会出现混杂。AOP的底层采用的是动态代理,默认采用的是jdk的动态代理。
18.AOP中几个重要的编程术语
切面:反之交叉业务逻辑(例如事务、日志)。实际上就是对主业务逻辑的功能增强。常用的切面实现有通知和顾问。
织入:将切面代码插入到目标对象的过程。
连接点:可以被切面织入的方法,通常业务接口中的方法均是连接点。
切入点:织入了切面代码的方法,即业务接口中被增强了的方法是切人点,未被增强的方法是连接点。
目标对象:要被增强的对象。
通知:切面的一种实现。通知决定了切入的时间点(切入点决定了可以切入的位置)。例如是在目标方法执行之前执行切入,还是在目标方法执行之后执行切入
顾问:切面的一种实现。是一种高级的通知。
19.spring框架对AOP思想的实现之一:通知
spring框架对AOP的思想进行了实现,实现的方式是通知。通知有四个接口:前置通知(MethodBeforeAdvice)、后置通知(AfterReturningAdvice)、环绕通知(MethodInterceptor)、异常通知(ThrowsAdvice)
20.spring框架之前置通知
实现MethodBeforeAdvice接口的类为前置通知,是对目标方法的增强。
MethodBeforeAdvice接口中只有一个before方法:public void before(Method method,Object[] args,Object target)
Method method:目标方法
Object[] args:目标方法的参数
Object target:目标对象
前置通知的特点:
1.前置通知中before方法是在目标方法执行之前执行的
2.前置通知不能改变目标方法的执行流程
3.前置通知不能改变目标方法的执行结果
配置文件方式实现步骤,需要在配置文件中配置如下信息:
1.注册目标对象
2.注册通知类(切面)
3.注册代理工厂类:
3.1在代理工厂内指定目标对象
3.2在代理工厂内指定目标对象实现的接口
3.3在代理工厂内指定切面
21.spring框架之后置通知
实现AfterReturningAdvice接口的类为后置通知,是对目标方法的增强。
AfterReturningAdvice接口中只有一个afterReturning方法:public void afterReturning(Object returnValue,Method method,Object[] args,Object target)
Object returnValue:目标方法的执行结果(与前置通知的区别),afterReturning方法返回的也是此值
Method method:目标方法
Object[] args:目标方法的参数
Object target:目标对象
后置通知的特点:
1.后置通知中afterReturning方法是在目标方法执行之后执行的
2.后置通知不能改变目标方法的执行流程
3.后置通知不能改变目标方法的执行结果,但是能获取到目标方法的执行结果
22.spring框架之环绕通知
环绕通知又称方法拦截器,是功能最强的一种通知。
实现MethodInterceptor接口的类为环绕通知,是对目标方法的增强。
MethodInterceptor接口中只有一个invoke方法:public Object invoke(MethodInvocation invocation)
返回值Object:目标方法的执行结果(可以是增强的结果)
Object[] args = invocation.getArguments():获取目标方法的参数列表,可以对其参数进行修改从而改变目标方法的执行流程
Object retVal = invocation.proceed():调用目标方法,可以对返回值retVal进行修改从而改变目标方法的执行结果
环绕通知的特点:
1.环绕通知中invoke方法可以在目标方法的之前或者之后执行
2.环绕通知可以改变目标方法的执行流程
3.环绕通知可以改变目标方法的执行结果
23.spring框架之异常通知
实现ThrowsAdvice接口的类为异常通知。该接口中没有定义要实现的方法,称为标识接口。
虽然形式上没有方法,但有必须要实现的方法afterThrowing,该方法在ThrowAdvice接口注释中,有四个重载的方法,一般常用的是afterThrowing(Exception ex).
异常通知的作用:在目标方法抛出异常后,根据不同的异常在异常通知中做出相应的处理(比如记录异常信息到文件/数据库、发送邮件/短信,写监控程序)