spring基础
来源:互联网 发布:linux防火墙策略 编辑:程序博客网 时间:2024/06/11 08:11
1. 概述
1.1.Ioc/DI(inversion of control控制反转/依赖注入)
应用本身不负责对象的创建和维护,对象和依赖对象创建完全交给spring容器去管理和维护,这个权利反转给spring容器了。使用Ioc降低了层与层之间的耦合性
问题:
1.1.1. 方案1,自己创建工厂模式。
工厂:
使用:
1.1.2. 方案2,使用spring的bean工厂
getBean(“beanId”)
1.2.AOP(面向切面/Aspect Oriented programming)
通过预编译的方式,在运行期使用动态代理的方式实现的一种技术。
1)在项目中使用aop来管理事务,事务的开启,提交,回滚。
2)在项目中管理事务的传播特性。
2. spring配置文件加载:
2.1.方案1
2.2.方案2
3. bean的创建
3.1.使用构造器创建
使用构造器创建bean,要求bean必须有默认的构造器,这是工作中最常用的方式。
spring配置文件:
3.2.静态工厂方式创建
首先,提供静态工厂类:
然后spring配置文件:
3.3.实例工厂方式创建
首先,提供实例工厂类:
然后spring配置文件:
4. bean延迟加载
1)所有的bean默认情况下,非延迟加载的,是spring容器创建的时候,就把bean创建出来了,我们getBean的时候直接从容器中去拿这个bean就可以了。
2)是否延迟加载有lazy-init来控制,默认是false,如果变成true,bean就在getBean的时候创建。
3)全局的延迟加载设置(所有bean都延迟加载,一般不用):
5. bean的作用域
默认情况下,bean都是单例的,是容器初始化的时候被创建的,就这么一份。
Scope:singleton单例, prototype:多例,默认使用singleton
如果是singleton我们使用lazy-init可以设置是否延迟加载。
如果是prototype只能是延迟加载,设置非延迟加载属性无效。
6. bean的生命周期
通过init方法和destroy的方法验证。
init是bean创建后被调用的,来初始化bean,做一些准备工作
destory是bean被销毁的时候调用的,做清理工作。
单例的Bean,生命周期和容器一致,容器被创建bean就被创建,容器销毁bean销毁。
7. 依赖注入方式
7.1.常量注入(常用)
7.2.构造器注入(不常用,bean中必须提供对应的构造器)
(1) 构造器注入常量
(2) 构造器注入变量
7.3.外部bean的注入(常用,必须提供对应的set方法)
7.4.内部bean的注入(不常用)
7.5.集合注入
都能注入:Set,List,Map,Properties等
首先bean,必须提供set方法:
(1) set
(2) list
(3) map
(4) prop
public class MovieRecommender { private Set<MovieCatalog> movieCatalogs; @Autowired public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ...}
小提示:如果当初定义的bean上有@Order注解或者标准注解@Priority的话,那么注入的集合就是有序的,这个元素顺序是当初注解定义的优先顺序。
@Autowired和@Resource
- autowired by type
- 可以 通过@Qualifier 显式指定 autowired by qualifier name(非集合类。注意:不是autowired by bean name!)
- 如果 autowired by type 失败(找不到或者找到多个实现),则退化为autowired by field name(非集合类)
@Resource
- 默认 autowired by field name
- 如果 autowired by field name失败,会退化为 autowired by type
- 可以 通过@Qualifier 显式指定 autowired by qualifier name
- 如果 autowired by qualifier name失败,会退化为 autowired by field name。但是这时候如果 autowired by field name失败,就不会再退化为autowired by type了。
7.6.注解注入
7.6.1. 配置文件
1)注解context的约束文件(引入context后,则.xml文件会有提示信息):
2)开启注解的驱动
开启注解扫描器,使用了该标签,不需要在使用上面的开启注解驱动标签
7.6.2. 注解
(1) @Resource
非spring注解,是javax下的
(1)作用在属性上,不需要提供set方法
Spring容器初始化时,若指定了name,则@Resource注解只根据name(“userDao2”)和bean的id匹配。若未指定name,则先根据变量名称userDao和bean的id匹配,如果匹配不上,则按接口UserDao和实现类的关系来匹配bean,这种情况下,如果一个接口(UserDao)有多个实现类的时候,必须通过name属性来指定到底注入哪一个,不指定会抛异常。
(2)作用在set方法上
基本规则同上,唯一不同如下:
不指定name时,如果左边三个框内的任意一个名称能匹配上,就能注入,三个都匹配不上,再按接口和实现类的关系匹配。
(2) @Autowired注解
(1)加在属性上
@autowired注解,只按着接口和实现类的关系匹配,如果该接口存在多个实现类,由于该注解没有name属性,需要结合@Qulifier注解来指定value。
可在配置文件中配置注入方式:byType、byName。。。
(2)加在属性上
同上
(3)required属性(不常用),默认为true,设置为false,不必须注人
(3)@Value
首先,@value需要参数,这里参数可以是两种形式:@Value("#{configProperties['t1.msgname']}")或者@Value("${t1.msgname}");
其次,下面我们来看看如何使用这两形式,在配置上有什么区别:
1、@Value("#{configProperties['t1.msgname']}")这种形式的配置中有“configProperties”,其实它指定的是配置文件的加载对象:配置如下:
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:/config/t1.properties</value>
</list>
</property>
</bean>
这样配置就可完成对属性的具体注入了;
2、@Value("${t1.msgname}")这种形式不需要指定具体加载对象,这时候需要一个关键的对象来完成PreferencesPlaceholderConfigurer,这个对象的配置可以利用上面配置1中的配置,也可以自己直接自定配置文件路径。
如果使用配置1中的配置,可以写成如下情况:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="properties" ref="configProperties"/>
</bean>
如果直接指定配置文件的话,可以写成如下情况:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location">
<value>config/t1.properties</value>
</property>
</bean>
8. spring的扫描器
9. spring和junit整合
10. spring读取properties文件
- spring-基础
- Spring基础
- Spring 基础
- Spring 基础
- spring 基础
- Spring基础
- spring基础
- Spring基础
- spring基础
- spring基础
- Spring基础
- Spring基础
- Spring 基础
- spring基础
- Spring基础
- Spring基础
- Spring基础
- spring基础
- 关于极限小数据!!!
- Centos下安装Scrapy
- hdu1730尼姆博弈
- java基础篇(十三)——三大特性之多态
- Hibernate 核心技术(一)
- spring基础
- 10-排序5 PAT Judge (25分)
- 2017计蒜之道初赛第四场-商汤科技的行人检测(简单)
- PAT 乙等 1027 打印沙漏
- 基于easyui的备忘录的实现
- Python中IO概述
- 12、消息提示框与模态弹窗
- HTTP中的GET和POST
- 扁平化立体字教程