文章目录
1、什么是 Spring 框架?
Spring是一个轻量级的Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题
Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发
2、Spring IOC 和 AOP
Spring IOC
IOC(Inverse of Control)控制反转
:是一种设计思想,DI(依赖注入)是实现IOC的一种方式
,就是将原本在程序中手动创建对象(new 对象)的控制权,交由Spring框架来管理。将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC 容器就像一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的
控制
:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的反转
:程序本身不创建对象,而变成被动的接收对象依赖注入
:利用set
方法来进行注入
链接:走你
Spring AOP
AOP(Aspect-Oriented Programming 面向切面编程)
:可以将那些与业务无关,但是可以将和业务模块所共同调用的逻辑(eg:事务,日志,权限)封装起来
,以便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性
Spring AOP
就是基于动态代理
的,如果要代理的对象实现了某个接口,那么Spring AOP
会使用JDK Proxy
去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy
去进行代理了,这时候Spring AOP
会使用Cglib
,这时候Spring AOP
会使用Cglib
生成一个被代理对象的子类来作为代理
3、Spring的优缺点?
优点:
- 方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理 - AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序的权限拦截、运行监控等功能 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程 - 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序 - 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)
缺点:
- Spring是一个轻量级的框架,但是给人的感觉很大
- 使用门槛升高,入门Spring需要较长时间
- Spring依赖反射,反射影响性能
4、Spring 框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory就是简单的简单工厂模式的体现,用来创建对象的实例
- 单例模式:Bean默认为单例模式
- 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
- 模板模式:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener
5、Spring支持的几种bean的作用域
singleton
:bean在每个Spring IOC容器中只有一个实例prototype
:一个bean的定义可以有多个实例request
:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext
情形下有效session
:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效global-session
:在一个全局的HTTP Session
中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext
情形下有效
6、spring 自动装配 bean 有哪些方式?
在Spring框架xml配置中共有5种自动装配
no
:默认的方式是(no
)不进行自动装配的,通过手工设置ref
属性来进行装配beanbyName
:通过bean的名称
进行自动装配,如果一个bean的property与另一个bean的name相同
,就进行自动装配byType
:通过参数的数据类型
进行自动装配constructor
:利用构造函数进行装配,并且构造函数的参数通过byType
进行装配autodetect
:自动探测,如果有构造方法,通过construct
的方式自动装配,否则使用byType
的方式自动装配
7、Spring注解
配置注解的支持
<context:annotation-config/>
@Component
:泛指组件,将java类标记为bean,当组件不好归类时,可以使用这个注解进行标注@Controller
:用于标注控制层组件@Service
:用于标注业务层组件@Repository
: 用于标注数据访问层组件@Required
:这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配@Autowired
:默认是按照类型装配注入的@Qualifier
:@Autowired是根据
类型自动装配的,加上
@Qualifier则可以根据
byName的方式自动装配,
@Qualifier`不能单独使用
8、@Autowired与@Resource区别
- @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上
@Autowired默认按类型装配(属于spring规范)
,默认情况下必须要求依赖对象必须存在,如果要允许null
值,可以设置它的required属性为false
,如:@Autowired(required=false)
,如果我们想使用名称
装配可以结合@Qualifier
注解进行使用@Resource(属于J2EE复返)
,默认按照名称
进行装配,名称可以通过name属性
进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找
,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配
- 它们的作用相同都是用注解方式注入对象,但执行顺序不同
@Autowired
通过byType方式
实现,@Resource
通过byName方式
实现
9、动态代理
动态代理分为两类
- 基于接口的动态代理 — JDK动态代理
- 基于类的动态代理 — cglib
JDK动态代理
核心 : InvocationHandler 和 Proxy
InvocationHandler
是由代理实例的调用处理程序实现的接口。每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke
方法- JDK动态代理的特点:
被代理的类实现接口
10、Spring的AOP的通知类型有哪些
- 前置通知
- 后置通知
- 最终通知
- 环绕通知
- 异常通知
11、Spring的AOP应用包括
- 用AOP声明性事务代替EJB的企业服务
- 用AOP做日志处理
- 用AOP做权限控制,如Spring Security
12、Spring AOP的名词?
切面(ASPECT)
:横切关注点被模块化的特殊对象通知(Advice)
:切面必须要完成的工作。即,它是类中的一个方法目标(Target)
:被通知对象代理(Proxy)
:向目标对象应用通知之后创建的对象切入点(PointCut)
:切面通知执行的“地点”的定义连接点(JoinPoint)
:与切入点匹配的执行点