配置文件
一、Spring
1.1、spring是什么
- Spring是分层的轻量级框架,以IOC(控制反转)和AOP()为内核,提供了展现层SpringMVC和持久层SpringJDBCTemlate以及业务层事务管理等众多技术,还能整合众多的第三方框架和类库。
spring 的优势
- 方便解耦,简化开发:通过提供IOC容器,可以将对象的依赖关系交由Spring进行控制。之前是在一个类里面创建对象,是写死的,而现在只是交由IOC去创建,我需要的时候只需要去找IOC去要就行。
- AOP编程的支持:通过进行切面编程,许多不容易用传统OOP实现的功能可以通过AOP轻松实现。
- 声明事务的支持:通过声明式方式可以灵活的进行事务管理,提高开发效率。
- 方便集成各种优秀的框架
- 降低JavaEE API的使用难度。
1.2、Spring快速入门
-
第一步:导入坐标;
-
第二步:创建Bean;
-
第三步:创建applicationContext.xml文件;
-
在配置文档进行配置;
-
创建ApplicationContext对象并getBean;
1.3、配置文件讲解
1.3.1、Bean标签基本配置
用于配置对象由Spring来创建,默认情况下它调用的是类中的无参构造,如果没有无参构造则不能创建成功;
- 基本属性:
(1)id:Bean实例在Srping中的唯一标识,不能出现重复;
(2)class:Bean的全包名;
1.3.2、Bean标签范围配置
- scope标签:指对象的作用范围,取值如下:
(1)singleton:默认值,单例的。当加载配置文件时(当应用加载时),就会创建该Bean对象,只要容器在,对象一直活着。当应用销毁或者容器销毁时,对象就被销毁了。
(2)prototype:多例的。在每次getBean时创建一个该Bean对象,即就是使用时创建,只要对象在被使用中,就一直活着,长时间不用时,就会被java垃圾回收机制回收。
(3)request:WEB项目中,Spring创建一个Bean对象,将对象存入到resquest域中;
(4)session:WEB项目中,Spring创建一个Bean对象,将对象存入到session域中 - scope标签的使用方式:
<bean id="userDao" class="com.zjh.dao.impl.UserDaoImpl" scope="prototype"></bean>
- 注意事项
1.3.3、Bean初始化和销毁方法的配置
- init-methon:指定类中的初始化方法。也就是说在对象创建时执行的方法。
- destory-method:指定类中销毁方法。也就是说在对象销毁时执行的方法。
- 使用方式:
<bean id="userDao" class="com.zjh.dao.impl.UserDaoImpl" init-methpd="init" destory-method="detory"></bean>
1.3.4、Bean实例化三种方式
- 无参构造方法实例化:常见的直接使用bean标签就是无参构造;
- 工厂静态方法实例化:首先先创建一个工厂类,并在该类里面写一个静态方法去创建Bean对象。然后在xml文件中进行配置,再通过getBean获取就行。
//先写静态工厂
public class Factory {
public static UserDao getUserDao() {
return new UserDaoImpl();
}
}
//配置xml文件
<bean id="userDao" class="com.zjh.dao.factory.Factory" factory-method="getUserDao"></bean>
//获取
UserDao userDao = (UserDao)getBean("userDao");
- 工厂实例方法实例化
1.3.5、依赖注入
- 依赖注入:他是Spring框架核心IOC的具体实现
- Bean依赖注入的方式:
(1)通过构造方法
1、首先该类的构造方法是有参数的。
2、在xml为文件里进行配置,如下所示;
<bean id="constructorDepend" class="com.zjh.depend.impl.ConstructorDependImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
注意:name的值和ref的值,name的值和构造方法参数名保持一致,ref和引用的bean的id保持一致。
(2)通过set方法
一、set注入的第一种配置方式
1、首先该类里面的该成员必须要有set方法,
通过xml文件的配置,从而进行注入。
2、使用方式
<bean id="depend" class="com.zjh.depend.impl.DependImpl">
//注意这个name的值和ref的值是怎么来的。
<property name="userDao" ref="userDao"></property>
</bean>
二、set的第二种注入方式(P命名空间)
1、首先,先在beans标签里面加入xmlns:p="http://www.springframework.org/schema/p"
2、然后编写bean标签: <bean id="depend2" class="com.zjh.depend.impl.DependImpl" p:userDao-ref="userDao"></bean>
(3)集合类型参数的注入
1、首先在一个类要存在集合的属性。并且这些集合属性要有set方法。
2、进行配置;
<bean id="gather" class="com.zjh.jihe.Gather">
<!-- 对List进行注入-->
<property name="list">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<!-- 对Map进行注入-->
<property name="map">
<map >
<entry key="a" value-ref="userDao2"></entry>
<entry key="b" value-ref="userDao2"></entry>
<entry key="c" value-ref="userDao2"></entry>
</map>
</property>
<!-- 对Properties进行注入-->
<property name="properties">
<props>
<prop key="p1">ppp</prop>
<prop key="p2">hhh</prop>
<prop key="p3">eee</prop>
</props>
</property>
</bean>
(4)对普通属性通过set进行注入
1、首先编写一个带有普通属性的类,并且该属性要有set方法。
2、进行配置。如下所示,注意:后面用的是value,而不是ref。
<bean id="userDao2" class="com.zjh.dao.impl.UserDaoImpl">
<property name="name" value="zjh"></property>
<property name="age" value="10"></property>
</bean>
1.3.6、 引入其他配置文件(分模块开发)
-
实际开发中,Spring的配置内容非常多,这就导致Spring配置很复杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过impo标签进行加载;
-
引用格式:
<import resource="applicaytionContext-XXX.xml"/>
1.4、Spring注解开发
1.4.1 、注解开发的优点
- Spring时是轻代码重配置的框架,配置比较繁琐重,影响开发速率,所以注解是一种趋势,注解代替xml文件,可以简化注解,提高开发效率。
1.4.2、注解开发的步骤
- 第一步:先在applicationContext.xml文件里面添加组件扫描;
<context: component-scan base-package="基础包名"></context:component-scan>
- 第二步:添加对应的注解
- 参考idea代码:spring_anno
- 个别注解的讲解
(1)@Scope:创建单例或者单例对象;
(2)@PostConstruct:对象初始化方法;
(3)@PreDestory:对象销毁时执行的方法; - 注入区分
(1)引用类型注入
当容器里只有一个UserDao类型的对象时,可以使用这个,也可以使用方式二。
但是当容器里有多个UserDao类型的对象时,必须使用方式二。
(1)注入方式1:根据类型进行注入
@Autowired
private UserDao userDao;
(2)注入方式2:根据id进行注入,但是必须@Autowired和@Qualifier一起使用
@Autowired
@Qualifier("userDao")
private UserDao userDao;
(3)注入方式3:相当于是将@Autowired和@Qualifier结合起来。
@Resource(name="userDao")//name后面的值是Bean对象的id。
private UserDao userDao;
(2)基础类型注入
(1)方式1:直接将值zjh赋值给name。
@Value("zjh")
String name;
(2)方式2:将properties里面键为name的值赋值给name;
(注意:必须要将properties文件先导入到xml文件里)
@Value("${name}")
String name;