Spring使用
1.什么是Spring2.IoC和AOP两大核心思想3.入门Spring3.1从Spring容器里得到bean对象,3.2 bean标签的基本配置(一个bean标签称为一个statement)3.3 bean的三种实例化方式3.4 三种(DI)依赖注入方式(相当给变量赋值)3.5 读取jdbc.properties文件3.6 分模块提供配置文件
4.基于注解的IoC(原始注解,重点)5.纯注解开发IoC(新注解)5.1.注解介绍5.2.配置核心类代码5.3.测试代码Spring整合Junit
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:返回一个值
编写测试类
3.1从Spring容器里得到bean对象,
ApplicationContext的实现类:
ClassPathXmlApplicationContext - 是从类加载路径里,加载xml配置文件的 - 什么是类加载路径:代码编译之后的那个classes文件夹 - 开发中可以认为Maven项目的:Java文件夹、resources文件夹,都是类加载路径AnnotationConfigApplicationContext - 用注解配置Spring时,通过此类加载配置类创建Spring容器,它用于读取类上的注解配置
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获取对应的对象
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>
3.4 三种(DI)依赖注入方式(相当给变量赋值)
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方法,不作介绍)
3.5 读取jdbc.properties文件
准备一个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>
读取jdbc.properties中的文件使用${配置文件中的key获取对应的值}
3.6 分模块提供配置文件
在大型项目开发中,如果把所有的配置都写在一个配置文件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 @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()
目的:指定配置文件或配置类