Spring
Spring优点
- 轻量级框架(不具有侵入性)
- IoC控制反转
- AOP面向切面编程
- 对事务的支持
- 对框架的支持
Spring框架内容
IoC
- Inverse of Control — 控制反转
- 对象原本由程序创建 -> 由程序接收对象
- 更加侧重于业务代码的实现
- 实现了service层和dao层的分离 -> 解耦(使得dao层和service层没有直接依赖关系,dao层的修改不需要修改service层)
spring使用步骤
- 导入相关jar包(需要导入commons-logging-x.x.x.jar)
- 编写spring配置文件,名称可以自定义
spring示例
bean类
public class Hello { private String name; public void setName(String name) { this.name = name; } public void show() { System.out.println("hello, " + name); } }
beans.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"> <!-- bean就是java对象,有spring容器创建和管理 --> <bean name="hello" class="com.eric.bean.Hello"> <property name="name" value="char"></property> </bean> </beans>
测试代码
public class Test { public static void main(String[] args) { //解析beans.xml文件 生成相应的bean对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = (Hello) context.getBean("hello"); hello.show(); //输出结果:hello, char } }
hello对象的创建: 对象是由spring容器创建的
- hello对象的属性: xml配置文件中有属性值,由spring容器为对象设置
整个过程即控制反转IoC
IoC思想及通过IoC创建对象
控制反转IoC
- 是一种编程思想。由主动的编程转变为被动的接收
- ioc的是有ioc容器来实现的,ioc容器即BeanFactory
- 控制:
- 指谁来控制对象的创建
- 传统的程序由程序本身控制的
- 使用spring后,由spring创建对象的
- 反转:
- 控制权限的转移
- 指程序本身不去创建对象,而变为被动的接收对象
- 总结: 以往的程序中,对象由程序本身创建;使用spring后,程序变为被动的接收spring创建好的对象
- 依赖注入
- 依赖注入和控制反转时同一个概念,只是描述的角度不同
使用ioc来创建对象的方式
通过无参构造方法创建
java代码
public class User { private String name; public User() { System.out.println("无参构造方法"); } public void setName(String name) { this.name = name; } public void show() { System.out.println("name = " + name); } }
配置文件
<bean id="user" class="com.eric.vo.User"> <property name="name" value="char"></property> </bean>
通过有参的构造方法创建
java代码
public class User2 { private String name; public User2(String name) { super(); this.name = name; System.out.println("有参构造方法"); } public void show() { System.out.println("name = " + name); } }
配置文件
<bean id="user2" class="com.eric.vo.User2"> <constructor-arg></constructor-arg> <!-- 可按照几下三种方式设置参数 --> </bean>
根据参数下标
index
,配置参数<constructor-arg index="0" value="eric"></constructor-arg>
根据参数名称设置
<!-- name的值指属性名称 --> <constructor-arg name="name" value="chenyu"></constructor-arg>
根据参数的类型来设置
<constructor-arg type="java.lang.String" value="char"></constructor-arg>
通过工厂方法来创建对象
静态工厂
- java代码提供有参构造方法
工厂代码
public class UserFactory { public static User3 newInstance(String name) { return new User3(name); } }
配置文件
<!-- class是工厂类,method是创建对象的方法 --> <bean id="user3" class="com.eric.factory.UserFactory" factory-method="newInstance"> <constructor-arg index="0" value="charFactory"></constructor-arg> </bean>
动态工厂
- java代码提供有参构造方法
工厂代码
public class UserDynamicFactory { public User3 newInstance(String name) { return new User3(name); } }
配置文件
<bean id="userDynamicFactory" class="com.eric.factory.UserDynamicFactory"/> <bean id="user4" factory-bean="userDynamicFactory" factory-method="newInstance"> <constructor-arg index="0" value="charDynamic"></constructor-arg> </bean>
配置文件概览
- 配置文件
- 别名配置
<alias>
<alias name="user" alias="userx"/>
name
属性为bean的id,alias
为别名
- 配置
<bean>
id
是bean的标识符,需要唯一。如果没有配置id
,默认name
作为标识符- 如果
id
,name
均配置了,那么name
将作为别名,别名可以设置多个 class
是bean的完全限定名 = 包名 + 类名- 如果不配置
id
和name
,可以通过ApplicationContext.getBean(Class)
获取对象 <scope>
定义bean的作用域
singleton
: 整个容器只有一个对象实例(默认)prototype
: 每次获取bean都产生一个新的对象request
: 每次请求时创建一个新的对象session
: 在会话的范围内是一个对象
- 导入配置
<import>
- 别名配置