Spring使用
1.什么是Spring
- Spring是分层的Java SE/EE应用 full-stack(全栈)轻量级开源框架,以IoC(Inversion of Controll控制反转,用于解耦)和AOP(Aspect oriented Programming,面向切面编程,本质是动态代理,不修改源码的情况下进行功能增强)为内核
2.IoC和AOP两大核心思想
- IoC:Inversion of Control,控制反转。是指 把创建对象的控制权交给框架:要想得到一个对象,由原来的主动创建对象,变成自己被动接收 框架创建的对象。
- 作用:用于降低程序间的耦合性
3.入门Spring
-
准备环境(创建maven项目,导入依赖)
-
创建目录结构(以数据库Account表为例)
-
创建Spring核心配置文件(命名随意,通常applicationContext.xml)
-
编写各个类(查询表中所有数据为例)
体现IOC的核心思想,不再以new生成对象,可以避免编译期依赖,通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制
图中涉及到的QueryRunner对象封装了jdbc的代码,开发dao层代码的简单框架。与JdbcTemplate功能相似。需要导入依赖
使用方法:- 创建DBUtils的核心类QueryRunner对象
- 构造方法:QueryRunner(DataSource ds) - 使用QueryRunner的方法操作数据库,常用方法有
- 执行DML语句:update(sql, params),返回int表示影响行数
- 执行DQL语句:query(sql, ResultSetHandler rh,params)- 返回值由ResultHandler的实现类对象决定
- BeanHandler:返回一个JavaBean对象
- BeanListHandler:返回一个JavaBean集合
- ScalarHandler:返回一个值
- 返回值由ResultHandler的实现类对象决定
- 创建DBUtils的核心类QueryRunner对象
-
编写测试类
-
3.1从Spring容器里得到bean对象,
ApplicationContext的实现类:- ClassPathXmlApplicationContext
- 是从类加载路径里,加载xml配置文件的
- 什么是类加载路径:代码编译之后的那个classes文件夹
- 开发中可以认为Maven项目的:Java文件夹、resources文件夹,都是类加载路径 - AnnotationConfigApplicationContext
- 用注解配置Spring时,通过此类加载配置类创建Spring容器,它用于读取类上的注解配置
- ClassPathXmlApplicationContext
ApplicationContext app = new ClassPathXmlApplicationContext("核心配置文件名.xml");
ApplicationContext app = new AnnotationConfigApplicationContext(核心配置类.class);
- getBean()方法
ApplicationContext提供了多种getBean方法的重载,常用的如下:
Object bean = app.getBean("唯一标识");//需要强转
对应类型 对象名= app.getBean("唯一标识", javabean.class类型)//无需强转
- 编写核心配置文件
-
3.2 bean标签的基本配置(一个bean标签称为一个statement)
- 基本属性: id:唯一标识、class:bean的全限定类名
通过对应的bean标签对应的id获取对应的对象
- 基本属性: id:唯一标识、class:bean的全限定类名
-
3.3 bean的三种实例化方式
-
无参构造方法实例化:让Spring调用bean的无参构造,生成bean实例对象
<bean id="accountDao" class="com.Xxxx.dao.impl.AccountDaoImpl"></bean>
-
工厂静态方法实例化:让Spring调用一个工厂类的静态方法,得到一个bean实例对象,假设在com.Xxxx包下创建factory(工厂包),创建一个StaticFactory工厂类
public class StaticFactory{
public static AccountDao createAccountDao(){
return new AccountDaoImpl();
}
}
核心配置文件:
<bean id="accountDao" class="com.Xxxx.factory.StaticFactory"
factory-method="createAccountDao"></bean>
- 工厂非静态方法实例化:让Spring调用一个工厂的非静态方法,得到一个bean实例对象,假设在com.Xxxx包下创建factory(工厂包),创建一个InstanceFactory工厂类
<!-- 先配置工厂 -->
<bean id="instanceFactory" class="com.Xxxx.factory.InstanceFactory"></bean>
<!-- 再配置AccountDao -->
<bean id="accountDao" factory-bean="instanceFactory" factory-method="createAccountDao"></bean>
- set方法注入,在类中提供需要注入的成员的set方法,在配置文件中注入属性的值
<bean id="" class="">
<property name="属性名" value="属性值"></property>
<property name="属性名" ref="bean的id"></property>
</bean>
- property标签:用在bean标签内部,表示要给某一属性注入数据
- name:属性名称
- value:要注入的属性值,注入简单类型值
- ref:要注入的属性值,注入其它bean对象
- 构造方法注入,在类中提供构造方法,通过构造方法给成员变量注入值
<bean id="" class="">
<constructor-arg name="构造参数名称" value="构造参数的值"></constructor-arg>
<constructor-arg name="构造参数名称" ref="bean的id"></constructor-arg>
</bean>
- name:构造参数的名称
- value:要注入的值,注入简单类型值
- ref:要注入的值,注入其它bean对象
- p名称空间注入(本质仍然是set方法,不作介绍)
- 准备一个properties文件放在resources里:jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver //驱动
jdbc.url=jdbc:mysql:///spring //数据库名
jdbc.username=root //数据库账号
jdbc.password=root //数据库密码
- 使用
<context:property-placeholder location="classpath:jdbc.properties"/>
需要导入Context命名空间
<beans
xmlns:名称空间="http://www.springframework.org/schema/名称空间"
xsi:scehmaLocation="
http://www.springframework.org/schema/名称空间
http://www.springframework.org/schema/名称空间/spring-名称空间.xsd">
</beans>
在大型项目开发中,如果把所有的配置都写在一个配置文件applicationContext.xml中,会导致:
- 配置文件过于臃肿
- 不利于分模块开发,不利于模块之间的解耦
Spring提供了分模块配置的方式,即:每个模块提供一个配置文件,在核心配置文件中引入模块配置:
<import resource="applicationContext-xx.xml"/>
<import resource="applicationContext-yy.xml"/>
- 将负责数据库的配置放入applicationContext.xml文件中
- 操作导入
4.基于注解的IoC(原始注解,重点)
-
以上例环境为例,进行注解开发
-
编写类
-
@Component:类级别的一个注解,用于声明一个bean,使用不多
-
value属性:bean的唯一标识。如果不配置,默认以首字母小写的变量名为id
-
@Controller, @Service, @Repository,作用和@Component完全一样,但更加的语义化,使用更多
-
@Controller:用于web层的bean
-
@Service:用于Service层的bean
-
@Reposiroty:用于dao层的bean
- @Autowired:用于注入bean对象(byType注入)
- 按依赖类型,从Spring容器中查找要注入的bean对象
- 如果找到一个,直接注入
- 如果找到多个,则以变量名为id,查找bean对象并注入
- 如果找不到,抛异常
- @Qualifier:是按id注入,但必须和@Autowired配合使用。
绝大多数情况下,只要使用@Autowired注解注入即可
注解注入时,不需要set方法了
-
核心配置文件
-
运行测试
5.纯注解开发IoC(新注解)
5.1.注解介绍
- @Configuration把一个Java类声明为核心配置类
- 加上Java类上,这个Java类就成为了Spring的核心配置类,用于代替applicationContext.xml
- 是@Component的衍生注解,所以:核心配置类也是bean,里边可以注入依赖
- @ComponentScan配置组件注解扫描
- basePackages属性:指定扫描的基本包
- @PropertySource用于加载properties文件
- value属性:指定propertis文件的路径,从类加载路径里加载
- @Import用于导入其它配置类
- Spring允许提供多个配置类(模块化配置),在核心配置类里加载其它配置类
- 相当于xml中的标签
- @Value:注入简单类型值,例如:基本数据类型和String
- @Bean注解:方法级别的注解
- 用于把方法返回值声明成为一个bean,作用相当于 < bean >标签
- 可以用在任意bean对象的方法中,但是通常用在@Configuration标记的核心配置类中
- @Bean注解的属性:
- value属性:bean的id。如果不设置,那么方法名就是bean的id
- value属性:bean的id。如果不设置,那么方法名就是bean的id
- @Bean的依赖注入
- @Bean注解的方法可以有任意参数,这些参数即是bean所需要的依赖
- @Bean注解的方法可以有任意参数,这些参数即是bean所需要的依赖
5.2.配置核心类代码
5.3.测试代码
Spring整合Junit
- 作用:在单元测试类里,就可以使用Spring的注解,注入依赖。不需要再自己创建容器获取对象
- 使用步骤
1. 在pom.xml文件中增加依赖:spring-test 和 junit
2. 修改单元测试类
1. 在单元测试类上增加注解:@RunWith(SpringJunit4ClassRunner.class)
目的:使用Spring的单元测试运行器,替换Junit原生的运行器
2. 在单元测试类上增加注解:@ContextConfiguration()
目的:指定配置文件或配置类