0%

Spring

1 Spring介绍

1.1 Spring概述

Spring是一个开源框架,与2003年兴起的轻量级Java开发框架。它是为了解决企业应用开发的复杂性而创建的。Spring是一个轻量级的控制反转和面向切面的容器框架。

方便解耦,简化开发:

  • Spring就是专门生产Bean的大工厂,可以将所有对象创建和依赖关系维护由Spring管理。

面向切面(AOP)编程的支持:

  • Spring提供面向切面编程,可以方便实现对程序进行权限拦截、运行监控等功能。

  • 声明式事务的支持:只需要通过配置就可以完成对事物的管理,为无需手动编程。

方便程序的测试:

  • Spring支持Junit4,可以通过注解方便测试Spring程序。

方便集成各种优秀框架:

  • 其内部提供了对各种优秀框架的支持。

降低JavaEE API的使用难度:

  • 对JavaEE开发中一些难用的API(JDBC、JavaMail、远程调用等),都提供了封装,这些API的应用难度大大降低。

1.2 Spring体系结构

Spring是一个分层结构,它包含一系列的功能要素并被分为大约20个模块。这些模块如下图所示:

1

2 Spring快速入门

web中集成Spring需要哪些包?IOC是什么?

2.1 编写流程

  • 下载Spring开发包。
  • 导入Spring的jar包。
  • 配置Spring的核心xml文件
  • 在程序中读取Spring的配置文件来获取bean(new好的对象)。

Spring各个版本的下载地址:

https://repo.spring.io/libs-release-local/org/springframework/spring/

第三方依赖包下载地址:

http://s3.amazonaws.com/dist.springframework.org/release/SPR/spring-framework-3.0.2.RELEASE-dependencies.zip

2.2 详细过程

写个简单的service。

UserServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class UserServiceImpl implements UserService{
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public void add() {
System.out.println("创建用户..." + name);
}
}

接下来使用Spring IoC控制反转创建实例,在src目录下写beans.xml配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
<?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(对象)-->
<bean id="userService" class="com.Retur0.service.UserServiceImpl">
<!--依赖注入数据-->
<property name="name" value="name01"></property>
</bean>

</beans>

test1.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class test1 {
@Test
public void test(){
//1. 加载beans.xml这个Spring配置文件,内部就会创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

//2. 从spring容器获取userService对象
UserService us1 = (UserService)context.getBean("userService");
us1.add();

UserService us2 = (UserService)context.getBean("userService");
us2.add();

System.out.println(us1);
System.out.println(us2);
}
}

结果:

1
2
3
4
创建用户...name01
创建用户...name01
com.Retur0.service.UserServiceImpl@79e2c065
com.Retur0.service.UserServiceImpl@79e2c065

会发现其实 us1 和 us2 是同一个对象。

2.3 IoC 控制反转

Inverse of Control 控制反转的概念,就是将原本在程序中手动创建对象的控制权,交给Spring框架管理。创建对象的控制权被反转到达了Spring框架。

2.4 DI 依赖注入

Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态地将依赖对象注入到Bean组件。

3 创建Spring容器的三种方式

3.1 三种方式

第一种:ClassPathXmlApplicationContext,参数中传入的是xml文件的对于src的相对路径。

1
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

第二种:文件系统路径获得配置文件,绝对路径。

1
ApplicationContext context = new FilePathXmlApplicationContext("C:\Users\38487\Desktop\IDEAWorkSpace\SpringDemo\src\beans.xml");

第三种:使用BeanFactory(已过时)。

1
2
String path = "C:\Users\38487\Desktop\IDEAWorkSpace\SpringDemo\src\beans.xml";
BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path));

在Spring内部:

  1. 解析xml文件,获取类名,id,属性。
  2. 通过反射,用类型创建对象。
  3. 给创建的对象赋值。

3.2 BeanFactory和ApplicationContext的对比

  • BeanFactory采取延迟加载,第一次getBean时才会初始化Bean。
  • ApplicationContext是对BeanFactory的扩展,提供了更多功能:
    • 国际化处理。
    • 事件传递。
    • Bean自动匹配。
    • 各种不同应用程的Context实现。

4 装配Bean

4.1 装配Bean的三种方式

所谓的装配Bean,就是在xml中写<bean>标签。

第一种:new实现类。

1
<bean id="userService" class="com.Retur0.service.UserServiceImpl"></bean>

第二种:通过静态工厂方法。

写一个静态工厂类,返回需要的对象。在Bean中配置这个工厂类,使用时getBean(“id”),返回为需要的对象。

1
<bean id="userService" class="com.Retur0.service.UserSereviceFactory" factory-method="createUserService"></bean>

第三种:通过实例工厂方法。

写一个工厂类,返回需要的对象。

1
2
<bean id="factory" class="com.Retur0.service.UserSereviceFactory"></bean>
<bean id="userService" factory-bean="factory" factory-method="createUserService"></bean>

4.2 Bean的作用域

  • singleton:单例,在Spring容器中只存在一个Bean实例,默认值。
  • prototype:每次从容器中调用bean时吗,都返回一个新的实例。每次调用fgetBean()时,相当于执行new XXXBean()。
  • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境。
  • session:同一个HTTP Session共享一个Bean,不同session使用不同bean。仅适用于WebApplicationContext环境。
  • globalSession:一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境。
1
<bean id="userService" class="com.Retur0.service.UserServiceImpl" scope="prototype"></bean>

5 xml依赖注入Bean属性

5.1 构造方法注入

在bean中,加入给属性初始化的构造函数。这样在xml中可以如下操作:

1
2
3
4
5
<bean id="stu" class="com.Retur0.model.Student">
<!--相当于调用public Student(String username, String password)构造方法-->
<constructor-arg name="username" value="name01"></constructor-arg>
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>

还可以这么写:

1
2
3
4
<bean id="stu" class="com.Retur0.model.Student">
<constructor-arg index=0 value="name01" type="java.lang.String"></constructor-arg>
<constructor-arg index=1 value="123456" type="java.lang.Integer"></constructor-arg>
</bean>

5.2 属性setter方法注入

通过<property>标签注入。

5.3 p命名空间注入

在xml文件的约束中加入一行:

1
xmlns:p="http://www.springframework.org/schema/p"

这样就引入了p命名空间,这个命名空间中有类的属性。

1
<bean id="stu" class="com.Retur0.model.Student" p:username="name01" p:password="123456"></bean>

在bean标签中如上配置,便可以使用命名空间对对象的属性进行初始化。

5.4 SpEL

Spring表达式。

  • <property>进行统一编程,所有内容都使用value。
1
<property name="" value="#{表达式}"></property>

#{123}、#{‘name01’}:数字、字符串。

#{beanId}:另一个bean引用。

#{beanId.propName}:操作数据。

#{beanId.toString()}:执行方法。

#{T(类).字段|方法}:静态方法或字段。

5.3 集合注入

集合注入的方法是给<property>添加子标签。

  • 数组:<array>
  • List:<list>
  • Map:<map>,map存放k/v键值对,使用<entry key="" value="">描述。
  • Properties:<props> <prop key=""></prop>

5.4 注解注入

注解是一个类,可以在开发中取代xml配置文件。

@Component 取代<bean class="">

@Component 取代<bean id="" class="">

@Repository(“名称”) :dao层。

@Service(“名称”):service层。

@Controller(“名称”):web层。

@Autowired:根据类型自动注入。

29

@Qualifier(“名称”):指定自动注入的id名称。

@Resource(name=”名称”)

@Scope(“prototype”):bean为多例。

@PostConstruct:自定义初始化。

@PreDestory:自定义销毁。

例:

在本应由xml配置的UserServiceImpl类前加@Component注解以代替在xml中的配置。

test.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void test() throws Exception{
/**
使用注解来取代xml中bean的配置。
Spring默认注解不生效,需要在xml中配置context约束以开启注解。
*/
//1. 加载beans.xml这个Spring配置文件,内部就会创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

//2. 从spring容器获取userService对象
// 如果在@Component中没有配置id,则通过类型获取。
UserService us1 = (UserService) context.getBean(UserServiceImpl.class);
us1.add();

System.out.println(us1);
}

beans.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解 -->
<context:annotation-config/>
<!-- 配置自动扫描注解的包-->
<context:component-scan base-package="com.Retur0.service"/>
</beans>