1.spring的话(轻量级框架,用户需要什么功能就自己添加相应的功能模块,其中自带的两大核心模块:springaop和springioc)
spring框架给项目带来的好处:
1,动态解耦,方便开发
将对象之间的依赖关系交给spring进行管理,避免代码与代码之间的过度耦合
2,方便集成各种优秀的框架
3,支持aop编程
4,spring是一个模块化的项目,可以根据自己的需要定制功能模块
5,默认为单例模式创建,节省开销
spring框架下的核心功能模块
core(spring的核心容器):Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能,即提供IOC和依赖注入。
Spring ORM:Spring与所有的主要的ORM映射框架都集成的很好,包括Hibernate、MyBatis等
Spring AOP(面向切面编程):Spring AOP模块将面向切面编程的功能集成了
SpringAOP指的是spring中的面向切面编程
它的核心原理是通过动态代理实现的
动态代理又分为
1.jdk自带的动态代理(默认的):通过反射来接收被代理的类,要求被代理的类必须实现一个接口,生成的代理对象的方法调用都会委托到Invocation.invoke()方法中(当我们调用被代理类的方法时,这个调用都是传送进invoke方法中调用,在通过Proxy类反射出代理类对象
2.cglib代理(用于没有实现接口的类,通过生成子类,在子类中加入需求,得到代理类)
aop编程的具体过程为:
将需求变成切面类(aspect),委托类中的方法变成连接点(joinpoint)
(通知)拦截器(advice)控制织入(wave)到方法执行的位置
增强器(adivsor用来删选哪些方法为连接点,默认委托类所有的方法为连接点),一组连接点即为切入点(JoinPoint)
SpringIoc核心是控制反转和依赖注入,控制反转将对象的依赖关系交给ioc容器,实现了对象的解耦合,通过xml文件的配置相应的bean,spring容器进行管理
而依赖注入,则有三种注入方式(这只是单纯的手动装配):
1.构造方法注入
2.注解注入 使用autowired注解配置
3.set方法注入
<!--property 对于所有用set方式来注入的必须使用该标签-->
<!--value 是对于基本类型,都用value(标签/属性)来注入,可以实现自动的数据类型转换-->
4.静态工厂的方法注入
让spring来生成和管理静态工厂(类的静态方法)产生的对象
public class DaoFactory { //静态工厂
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
}
}
public class SpringAction {
private FactoryDao staticFactoryDao; //注入对象
//注入对象的 set 方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
}
}
//factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
<bean name="springAction" class=" SpringAction" >
<!--使用静态工厂的方法注入对象,对应下面的配置文件-->
<property name="staticFactoryDao" ref="staticFactoryDao"></property>
</bean>
<!--此处获取对象的方式是从工厂类中获取静态方法-->
<bean name="staticFactoryDao" class="DaoFactory"
factory-method="getStaticFactoryDaoImpl"></bean>
5.实例工厂的方法注入
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先 先管理 工厂类,在使用工厂类生成的对象
<bean name="springAction" class="SpringAction">
<!--使用实例工厂的方法注入对象,对应下面的配置文件-->
<property name="factoryDao" ref="factoryDao"></property>
</bean>
<!--此处获取对象的方式是从工厂类中获取实例方法-->
<bean name="daoFactory" class="com.DaoFactory"></bean>
<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
spring提供了bean单例模式开发,但不保证是线程安全的
spring用ThreadLocal处理线程并发
Spring五种自动装配模式的区别
1.默认配置:需自行用标签设置依赖关系(ref标签设置)
2.byName:根据bean的name来查询一个匹配的bean(id属性)
3.byType:根据bean的类型来查询一个匹配的bean(class属性)
4.constructor:根据bean的构造器来查询一个匹配的bean,首先找合适带参数的
5.autodetect:先探测构造器装配(如果有默认构造函数则选择构造注入不然选择byType注入),在选择byType的自动装配.
spring中的bean五种作用域:
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。
如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。