spring概述
Spring是一个非常活跃的开源框架,为了解决企业应用开发的复杂性而创建。
目前,Spring框架包含的功能大约由20个模块组成。这些模块按组可分为核心容器、数据访问/集成,Web,AOP(面向切面编程)、设备、消息和测试
但总的来说,Spring最核心的还是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架;它基于以上两点来构架多层JavaEE系统,以帮助分离项目组件之间的依赖关系、
IOC / DI 概述
IOC 概述: (Inversion of Control) 控制反转
理解控制正转,即控制权掌握在自己手中;
控制权掌握在手中:负责整个对象的创建 [掌握对象的任何细节] 。即 把对象 new 出来
好处: 掌握对象的所有细节,对对象拥有控制权和维护权
坏处:耦合性太高,浪费太多的时间和精力在对象的维护上,不利于开展自己核心业务
案例: 假设你去旅行,需要依赖各种交通工具。 请问,你会在旅行的过程中,不断的自己去创建交通工具吗?
IOC的定义和方式
IOC定义:指把创建对象的权利[new 类名()]反转给 容器
这样的好处:降低耦合 利于专注于自己的核心业务
实现方式:将所有需要new的对象都配置到容器中,通过读取容器的配置文件 ,利用反射技术new出来
spring IOC快速入门
1.下载/ 导入 spring jar包
主要jar说明: 4核心(beans、core、context,expression) + 1个依赖(common-logging.jar)
Pom.xml的依赖
|
<dependency>
|
2.新建 容器配置文件 ApplicationContext.xml
|
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> |
3.编写简单的javaBean
public class Car {
public void go(String address){
System.out.println("启动引擎"+"去"+ address);
}
}
4.将javaBean,注册到 容器的配置文件中
<bean id="car" class="com.springioc.basic.beans.Car"/>
5.编写测试类 IOC
|
public class TestBeans { public static void main(String[] args) { //1.读取容器配置文件,产生容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml"); //2.从容器中,获取该对象 Car car = (Car) applicationContext.getBean("car"); //3.用新产生的对象,执行方法 car.go("杭州"); } } |
4.spring加载容器的三种方式
类路径加载
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
文件路径加载
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("D:\\IdeaProjects\\springioc\\src\\main\\resources\\ApplicationContext.xml");
BeanFactory方式加载
String path = "D:\\IdeaProjects\\springioc\\src\\main\\resources\\ApplicationContext.xml";
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(path));
BeanFactory和ApplicationContext对比
BeanFactory 采取延迟加载,第一次getBean时才会初始化Bean
ApplicationContext 即时加载; 它是对BeanFactory扩展,提供了更多功能
启动web时候,ApplicationContext容器会自动初始化所有singleton Bean,在前期启动创建它的时候有较大系统开销,但后续程序获取singleton Bean实例时,将有较好性能
5.bean 的装配
bean的实例化[new] 三种方式
构造方法[无参]实例化
<!--方式一:采用 无参构造函数 -->
<bean id="baseCar" class="com.hzp.beans.Car" ></bean>
静态工厂实例化
public class CarStaticFactory {
//静态工厂
public static ICar createCar(){
return new Car();
}
}
普通工厂实例化
public class DaoFactory {
//实例工厂
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
}
}
<!--方式三: 采用普通工厂 -->
<!-- 先有 daoFactory ,然后用 factory-bean 及 factory-method 说明调用方式 -->
<bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean>
<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
6.bean属性的主要配置
属性列表
Bean Scope作用域
Bean的生命周期 【init-method destroy-method】
初始化bean ===> 给bean打标签名(BeanNameAware) ===> 装载到beanFactory中(BeanFactoryAware) ==> 前期统一处理 ==> 属性关联===》调用初始化 Init-method ==》后期统一处理 ==》 业务处理
容器关闭 ==》执行destroy ==》调用bean的 destroy-method 方法
bean的懒加载 init-lazy
默认false 不进行懒加载
spring 依赖注入(DI)
DI (Dependency Injection 依赖注入)
什么是依赖:当一个类执行方法(人==》 旅行()),处理核心业务时,需要借助其他类(汽车 飞机)来完成,那么,就说 这个类依赖其他类
控制反转IOC,是一种思想方案,即将new的过程,反向交由容器管理,以减少对象生成及维护细节的探讨。而DI是IOC最好的实现方案,即:类和类之间有依赖关系时,对依赖的类采取注入的方式实现是最佳实践。
所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦.
spring依赖注入方式
属性setter注入
普通属性注入 整数、布尔、 字符串
对象属性注入
集合属性注入
p命名空间注入【了解】
|
<!-- 需要在 beans的配置文件上添加 p标签支持 xmlns:p="http://www.springframework.org/schema/p"--> <bean id="userService" class="com.hzp.spring.service.UserService" /> <bean id="userAction" class="com.hzp.spring.action.UserController" p:username="用户名" p:userService-ref="userService" /> |
spEL表达式注入【了解】
|
对<property>进行统一编程,所有的内容都使用value <property name="" value="#{表达式}"> #{123}、#{'jack'} : 数字、字符串 #{beanId} :另一个bean引用 #{beanId.propName} :操作数据 #{beanId.toString()} :执行方法 #{T(类).字段|方法} :静态方法或字段
|
读取外部配置文件的方式
用法
|
<property name="driverClassName" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> <property name="url" value="${jdbc.url}"/> |
自动装配【重点】:
<bean autowired=”byName”>
- 按名称对应 装配 ;要求:名称必须一一对应
<bean autowired=”byType”>
- 按接口对应的类型进行装配; 对名字没有要求;但是,不能有多个实现类;
构造注入【重点】
构造一个参数
构造函数多个参数
<!-- 顺序匹配 -->
<bean id="person" class="com.hzqf.start.Person" >
<constructor-arg value="20" ></constructor-arg>
</bean>
<!-- 参数类型匹配 -->
<bean id="person2" class="com.hzqf.start.Person">
<constructor-arg type="java.lang.Integer" value="30"/>
<constructor-arg type="com.hzqf.start.beans.Car" ref="car" />
</bean>
<!-- 索引匹配 -->
<bean id="person3" class="com.hzqf.start.Person">
<constructor-arg index="0" value="30"/>
<constructor-arg index="1" value="李四"/>
<constructor-arg index="2" ref="car"/>
</bean>
<!-- 混合匹配 -->
<bean id="person4" class="com.hzqf.start.Person">
<constructor-arg index="0" type="java.lang.Integer" name="age" value="30"/>
<constructor-arg index="1" type="java.lang.String" name="name" value="李四"/>
<constructor-arg index="2" ref="car"/>
</bean>
注解的形式
自动装配 @Autowired 和 @Resource
<!-- 采用包扫描一下-->
<context:component-scan base-package="com.hzqf.start.web" />
在对应的类上 标注注解
Web开发常用注解
@Component 【组件】
@Controller 【控制】
@Service 【服务】
@Repository 【仓库】
其他注解
属性赋值 @Value
作用域@Scope("prototype")
生命周期 @PostConstruct @PreDestroy
Spring 整合JUnit单元测试
导入jar包
|
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> |
创建测试类
//创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用哪个配置文件
@ContextConfiguration("classpath:Annotation.xml")
public class SpringTest {
@Autowired
private UserController userController;
@Test
public void testController()
{
userController.initSuccess();
}
}