1.Spring是什么?
Spring是一个Service 层的框架,可以整合许多其他框架进行工作。
Spring的主要技术是IOC(控制反转)和AOP(面向切面编程)。
①什么是控制反转?
简单来讲就是将对象创建的权利和对象生命周期的管理过程交给Spring框架来处理,从而在开发的过程中不再需要关注对象的创建和生命周期的管理,而是需要时由Spring框架来提供,这个由Spring框架管理对象创建和生命周期的机制叫做控制反转。在创建对象的过程中,Spring可以通过对对象属性的进行设置,这个过程称之为依赖注入,也就是DI。
②IOC的实现原理
在创建一个Spring容器时,Spring会去解析指定的xml文件,当解析到其中的<bean>标签时,会根据其中的class属性指定类的全路径名,通过反射创建该类的对象,并将该类存入内置的Map中进行管理,其中键就是该标签的id值,值就是该对象。之后,通过getBean方法来从容器中获取对象时,其实就是根据传入的条件在内置的Map中进行匹配,如果有则返回,没有则抛出异常。
③IOC获取对象的方式:
通过context.getBean()方法获取bean时有两种方式:
传入id值,传入class类型
通过class方式获取bean时,若同一个类匹配多个bean,则在获取时因为无法确定到底要获取哪个bean会抛出异常,同时,在获取bean时,若找不到该类型的bean还会去检查是否存在该类型的子孙类型bean,若有,则返回若找不到或找到多个则抛出异常,符合面向对象多态的特性,而id是惟一的,不存在这样的问题,所以尽量使用id。
④Spring创建对象的方式
通过类的无参构造方法创建对象:
通过指定构造器创建对象
通过工厂创建对象
2.单例和多例
Spring默认采用单例模式,减少了对象的创建,从而减少了内存的消耗,但在开发过程中是存在多例的需求的,Spring也提供了选项可以将bean设置为多例。
bean在单例模式下,spring容器启动时解析xml发现该bean标签后,直接创建该bean对象并存入map中,此后无论调用多少次getBean()获取该对象时返回的都是一个对象,此对象一直被spring容器持有,直到容器退出时,对象被移出容器。
bean在多例模式下,spring在解析时,只是将bean进行管理,并不会创建对象,每次调用返回的都是一个新的对象,这个对象spring容器并不会拥有,何时销毁取决于用户程序本身。
3.懒加载机制:
可以规定指定的bean不在启动时就立即创建,而是在后续第一次用到时才创建,从而减轻启动过程中对时间和内存的消耗。懒加载机制只对单例bean有作用,对于多例bean设置懒加载是没有意义的,懒加载只是延后了对象创建的时机,对象仍是单例的。
①为指定的bean配置懒加载:<bean id ="" class="" lazy-init=''true"></bean>
②为全局配置懒加载:<default-lazy-init="true">
如果同时设定全局变量和指定变量,且配置不相同,则局部配置覆盖全局配置
4.自动装配:
自动装配就是要根据要设置的javabean属性的名字或类型到spring中自动寻找对应id或类型的bean进行注入设置,从而省去依次配置的过程,简化了配置。
5.spring注解方式实现IOC和DI
spring除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,代码在哪对应的配置就在哪,方便开发阶段进行修改。
①spring注解方式实现IOC
a、导入开发包;
b、编写配置文件,并导入context约束;
c、开启包扫描;<context:component-scan base-package=""></context:component-scan>
d、使用注解注册bean:在配置的包中的类上使用@Component注解,则这个类会自动被注册为bean
e、bean的id;通常情况下注解注册bean实用类名首字母小写为bean的id,但是如果类名的第二个字母为大写则首字母保留原样。
f、也可以通过在@Component中配置value属性,明确的指定bean的id;
g、在bean中的属性上通过@Autowired实现自定义bean类型的属性注入
h、当spring解析到@Component注解时,创建当前类的bean在spring容器中进行管理,在创建bean的过程中发现了@Autowired注解,会根据当前的bean类型,寻找在spring中是否存在该类型的bean,找到直接注入,找不到则会检查其子孙类,实现类是否存在,若存在唯一的则自动注入,若没有找到或者找到多个无法注入,则会按照属性名对应的id去查找对应的bean,若存在则注入,否则抛出异常。
I、其他的一些注解:@Scope(value=“prototype”),配置是单例还是多例,默认为单例
@Lazy懒加载机制
@PostConsrtuct修饰某个方法,将该方法声明为初始化方法,对象创建后立即执行。
@PreDestroy修饰某个方法,将该方法声明为销毁的方法,对象销毁前调用的方法。
@Controller(控制层,一般用在web层);
@Service(业务访问层,一般用在service层);
@Respository(数据访问层,一般用在dao层);
@Component(通用的注解)四个功能完全相同,都是用来修饰类,将类声明为Spring管理的bean的。