Spring
Spring是分层的Java SE/EE应用全站轻量级开源框架,以Ioc反转控制和AOP面向切面编程为内核
提供展现层SpringMVC和持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术
方便解耦,简化开发
通过Spring提供的Ioc容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码
AOP编程的支持
通过Spring的AOP功能,方便进行面向切面编程,许多不容易用传统OOP实现的功能可以通过AOP轻松实现
声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量
方便测试
Spring开发步骤
- 导入Spring开发的基本包坐标
- 编写Dao接口和实现类
- 创建Spring核心配置文件
- 在Spring配置文件中配置UserDaoImpl
- 使用Spring的API获得Bean实例
Spring配置文件
Bean标签
Bean标签基本配置
用于配置对象交由spring来创建
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功
基本属性:
- id:Bean实例在Spring容器中的唯一标识
- class:Bean的全限定名称
Bean标签范围配置
scope:指对象的作用范围
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | web项目中,Spring创建一个Bean对象,将对象存入到request域中 |
session | web项目中,Spring创建一个Bean对象,将对象存入到session域中 |
global session | web项目中,应用在Portlet环境,如果没有Portlet环境那么globalSession相当于session |
singleton:
当Spring核心文件被加载时,实例化配置的Bean实例
- 对象创建:当应用加载,创建容器时,对象创建
- 对象运行:容器存在,对象存在
- 对象销毁:当应用销毁,销毁容器时,对象销毁
prototype:
当调用getBean()方法时实例化Bean
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:对象在使用,即存在
- 对象销毁:当对象长时间不使用,被Java垃圾回收器回收了
Bean生命周期配置
init() ;destory();
Bean实例化三种方式
- 无参构造
- 工厂静态
- 工厂实例
Bean的依赖注入
Bean的依赖注入分析
因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部
Bean的依赖注入概念
依赖注入:Spring框架核心IOC的具体实现
在编写程序时,通过控制反转,把对象的创建交给Spring,但是代码中不可能出现没有依赖的情况
IOC解耦只是降低依赖关系,并不会消除。
坐等框架把持久层对象传入业务层,而不用自己去获取
Bean的依赖注入方式
- 构造方法
- set方法
set方法注入:
P命名空间注入本质也是set方法注入,更加方便
首先引入P命名空间
xmlns:p="http://www.springframework.org/schema/p"
其次,修改注入方式
<bean id="userService" class="xxx.xxx.UserServiceImpl" p:userDao-ref="userDao"/>
构造方法注入
首先撰写构造方法
然后修改注入方式,形同普通注入
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
Bean的依赖注入数据类型
注入数据的三种数据类型:
- 普通数据类型
- 引用数据类型
- 集合数据类型
引入其他配置文件(分模块开发)
Spring配置文件拆解,通过import
标签进行加载
<import resource='applicationContext-xxx.xml'/>
Spring重点配置
<bean>标签
id属性:在容器中Bean实例的唯一标识,不允许重复
class属性:要实例化的Bean的全限定名
scope属性:Bean的作用范围,常用的是Singleton(默认)和prototype
<property>标签:属性注入
name属性:属性名称
value属性:注入的普通属性值
ref属性:注入的对象引用值
<list>标签
<map>标签
<properties>标签
<constructor-arg>标签
<import>标签:导入其他的Spring的分文件
Spring相关API
ApplicationContext实现类
ClassPathXmlApplicationContext
:从类的根路径下加载配置文件(resources路径)FileSystemXmlApplicationContext
:从磁盘路径加载配置文件,配置文件可以在磁盘的任意位置AnnotationConfigApplicationContext
:使用注解配置容器对象时,需要用此类创建Spring容器,读取注解
getBean()方法使用
- 利用
id
传递,getBean("userService")
,多个- 利用字节码传递,
getBean(userService.class)
,单个
Spring配置数据源
数据源(连接池)的作用
- 数据源提高程序性能
- 事先实例化数据源,初始化部分连接资源
- 使用连接资源时从数据源获取
- 使用完毕将连接资源归还数据源
常见数据源(连接池):DBCP,C3P0,BoneCP,Druid
数据源开发步骤
导包–创建数据源对象–设置基本连接数据–使用数据源
Spring配置数据源
将DataSource的创建权交给Spring容器
@Test
//测试Spring容器产生 c3p0数据源对象
public void test4() throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource datasource = (DataSource) applicationContext.getBean("dataSource1");
Connection connection = datasource.getConnection();
System.out.println(connection);
connection.close();
}
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/student"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
抽取jdbc配置文件
applicationContext.xml加载jdbc.properties配置文件获得连接信息
首先引入context命名空间和约束路径:
- 命名空间:
xmlns:context="http://www.springframework.org/schema/context"
- 约束路径:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!-- 加载外部的properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
Spring注解开发
Spring原始注解
Spring注解代替xml配置文件可以简化配置,提高开发效率
原始注解主要是替代
的配置
注解 说明 @Component
使用在类上用于实例化Bean @Controller
使用在web层类上用于实例化Bean @Service
使用在service层类上用于实例化Bean @Repository
使用在dao层类上用于实例化Bean @Autowried
使用在字段上用于根据类型依赖注入 @Qualifier
结合@Autowried一起使用用于根据名称进行依赖注入 @Resource
相当于@Autowried+@Qualifier,按照名称进行注入 @Value
注入普通属性 @Scope
标注Bean的作用范围 @PostConstruct
使用在方法上标注该方法是Bean的初始化方法 @PreDestroy
使用在方法上标注该方法是Bean的销毁方法 注意:
使用注解开发,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
<context:component-scan base-package="com.xxx"></context:component-scan>
新注解
注解 | 说明 |
---|---|
@Configuration |
用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解 |
@ComponentScan |
用于指定Spring在初始化容器时要扫描的包 |
@Bean |
使用在方法上,标注将该方法的返回值存储到Spring容器中 |
@PropertySource |
用于加载.propertoes 文件中的配置 |
@Import |
用于导入其他配置类 |
Spring整合Junit
Spring集成Junit步骤
- 导入spring集成Junit坐标
- 使用@Runwith注解替换原来的运行期
- 使用@ContextConfiguration指定配置文件或配置类
- 使用@Autowired注入需要测试的对象
- 创建测试方法进行测试
可以留下你的信息哦(去Github_issues)😀😀😀
GitHub Issues