文章目录
Spring框架
1. Spring是什么?
- Spring是分层的javaSE/EE应用的全栈式轻量级开源框架,以Ioc(控制反转)和Aop(面向切面编程)为内核,提供了展现层(SpringMVC)和持久层(SpringJDBC)以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的java EE企业应用开源框架。
2. Spring的优势
- 方便解耦,简化开发
- AOP编程的支持
- 声明式事务的支持
- 方便程序的调试
- 方便集成各种优秀框架
- 降低Java EE API的使用难度
- java源代码是经典学习的范例
3.IOC(控制反转)
- 概念:是一种设计思想:将设计好的对象交由容器去处理(而不是传统的在对象内部直接控制),由容器来负责创建及注入依赖对象
- 作用:减弱程序的耦合
- DI(依赖注入):是ioc的一部分,由容器动态的将某个依赖关系注入到组件中(利用了java的反射机制)
4.xml配置
- 1.bean标签
- 作用:用于配置,让spring来创建对象,并存入ioc容器中
- 属性
- id:给对象在容器中提供一个唯一标识,用于获取对象
- class:指定类的全限定类名,用于反射创建对象,默认情况下调用无参构造函数
- scope:指定对象的作用范围
- singleton:默认值,单例的
- prototype:多例的
- request:web项目中,spring创建一个bean对象,将对象存入到request域中去
- session:web项目中,spring创建一个bean对象,将对象存入到session域中去
- global session:web项目中,应用在Portlet环境(它是基于java的web组件),如果没有此环境,它相当于session
- init-method:指定类中的初始化方法名称
- destroy-method:指定类中销毁方法名称
- 实例化bean的三种方式
- 1.使用默认无参构造函数
- 2.使用静态工厂的方法创建对象
- 使用实例工厂的方法创建对象
<!-- 使用构造函数注入创建,默认使用无参构造,如果没有无参构造会报错,所以需要 constructor-arg标签来设置参数 -->
<bean id="boy" class="com.itlaobing.spring.Boy">
<constructor-arg index="0" type="com.itlaobing.spring.IPet" ref="cat">
</constructor-arg>
</bean>
----------------------------------------------------------------------------
<!--方式二:使用静态工厂创建对象 factory-method 属性:指定生产对象的静态方法
(使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器 )-->
<bean id="boy" class="com.itlaobing.factory.BoyFactory" factory-method="getInstance">
</bean>
----------------------------------------------------------------
<!-- 此种方式是: 先把工厂的创建交给 spring 来管理。 然后在使用工厂的 bean 来调用里面的方法 factory-bean 属性:用于指定实例工厂 bean 的 id。 factory-method 属性:用于指定实例工厂中创建对象的方法。 -->
<bean id="boyFactory" class="com.itlaobing.spring.factory.BoyInstanceFactory">
</bean>
<bean id="boy" factory-bean="boyFactory" factorymethod="createInstance" lazy-init="false">
<property name="pet" ref="cat"></property>
</bean>
- 2.加载properties文件
- 3.配置扫包
<context:property-placeholder location="db.properties"> </context:property-placeholder>
----------------------------------------------------------
<context:component-scan base-package="com.itlaobing"></context:component-scan>
5.懒加载
- 延迟加载
- 概念:在启动spring容器时不实例化bean对象,而是在需要对象时实例化bean对象
<bean id="boyFactory" class="com.itlaobing.spring.factory.BoyInstanceFactory"></bean> <bean id="boy" factory-bean="boyFactory" factory-method="createInstance" lazy-init="true">
<property name="pet" ref="cat"></property>
</bean>
6.常见的注解配置
-
1.创建对象
- @Component
- @Component(“value”):创建Bean对象==xml中的bean标签 ,value:指定bean的id,如果不指定value属性,默认bean的id是当前类的类名。首字母小写
- @Controller(表现层)
- @Service(业务层)
- @Repository(持久层)
- 这些都是@Component的衍生注解,标注方式相同
- @Component
-
2.注入数据
- @Autowired
- 自动按照类型注入
- 默认为true,要求依赖对象必须存在,如果允许为空设置(required)= false属性
- @Resource
- @Resource:默认按照名称配置
- 同时配置name和type,name 和type都满足才行
- 只配置name,只按照name匹配
- 只配置type,只按照type匹配
- 都不配置,先按照name匹配,找不到再按照匹配类型(默认)
- @Autowired
-
3.改变作用范围
- @Scope:指定bean的作用范围
- value指定范围的值,取值:singleton, prototype, request, session , globalsession
-
5.其他
- @PropertySource
- 加载properties文件== xml中的context:property-placeholder
7.spring注解和xml的选择
- 注解的优势:配置简单,维护方便(我们找到类,就相当于找到了相应的配置)
- xml的优势:修改时,不用修改源码,不涉及重新编译和部署
8. @Autowired 和 @Resource的区别
- 1.@Autowired与@Resource都可以用来装配bean,都可以写在字段上,或者写在setter方法上
- 2.@Autowired默认按类型装配(这个注解是属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置他的required属性为false
- 3.@Resource(这个注解属于j2ee的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是 ,如果name属性一旦指定,就只会按照名称进行装配
9.整合测试junit
- 减少重复代码
// 1.使用 ApplicationContext 接口,就是在获取 spring 容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 2. 获取响应的 bean 对象
AccountServiceImpl accountService =(AccountServiceImpl)applicationContext.getBean("accountService");
10.AOP(面向切面编程)
- 概念:把程序中重复的代码抽取出来,在执行时,使用动态代理技术,在不修改源码的基础上,对已有的方法进行加强
- 原理:动态代理
- 作用:减少重复代码,提高开发效率,方便维护
11.IOC和DI的解释
- IOC
- 控制反转时一种设计思想,IOC意味着将你设计好的对象交给容器控制,而不是直接new对象
- ioc是有专门一个容器来创建这些对象,即由ioc容器来控制对象的创建
- 反转是由容器来帮忙创建及注入依赖对象,因为由容器帮我们查找及注入依赖对象,对象是被动的接受依赖对象,这就是反转
- DI
- DI是IOC的一种实现方式,组件之间依赖关系由容器在运行期决定,形象地说,即由容器动态的将某个依赖对象注入到组件之中