spring入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

1.Spring框架的概述

2.Spring的快速入门

3.Spring 工厂接口

4.IoC容器装配Bean(xml配置方式)

5.Ioc容器装配Bean(注解方式)

6.在web项目中集成Spring

7.Spring 整合 junit4 测试
```
<!-- more -->

## spring概述

01. Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
- 分层:
- SUN提供的EE的三层结构:web层、业务层、数据访问层(持久层,集成层)
- Struts2是web层基于MVC设计模式框架.
- Hibernate是持久的一个ORM的框架.
- 一站式:
- Spring框架有对三层的每层解决方案:
- web层:Spring MVC.
- 持久层:JDBC Template
- 业务层:Spring的Bean管理.



02. Spring的核心

* IOC:(Inverse of Control 反转控制)
* 控制反转:将对象的创建权,交由Spring完成.
* AOP:Aspect Oriented Programming 是 面向对象的功能延伸.不是替换面向对象,是用来解决OO中一些问题.
*

03. Spring优点
- 方便解耦,简化开发
- Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理

AOP编程的支持

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

声明式事务的支持

- 只需要通过配置就可以完成对事务的管理,而无需手动编程

方便程序的测试

- Spring对Junit4支持,可以通过注解方便的测试Spring程序

方便集成各种优秀框架

- Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

降低JavaEE API的使用难度

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



## Spring的快速入门

01. 下载spring包
02. 创建web工程。导入jar包
03. 创建spring配置文件

在src下创建一个applicationContext.xml
引入XML的约束:

* 找到xsd-config.html.引入beans约束:

```xml
<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">
  1. 配合文件中配置类
  2. 创建测试类

IoC容器装配Bean(xml配置方式)

  1. Spring框架Bean实例化的方式:

    • 提供了三种方式实例化Bean.

      – 构造方法实例化:(默认无参数)
      – 静态工厂实例化:
      – 实例工厂实例化:

    无参数构造方法的实例化

1
2
<!-- 默认情况下使用的就是无参数的构造方法. -->
<bean id="bean1" class="cn.xxxx.Bean1"></bean>
> 静态工厂实例化:  
1
2
<!-- 第二种使用静态工厂实例化 -->
<bean id="bean2" class="cn.xxx.Bean2Factory" factory-method="getBean2"></bean>
> 实例工厂实例化:  
1
2
3
<!-- 第三种使用实例工厂实例化 -->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="cn.xxx.Bean3Factory"/>
  1. Bean的其他配置

    Id和name的区别:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    id遵守XML约束的id的约束.id约束保证这个属性的值是唯一的, 而且必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号
    name没有这些要求
    如果bean标签上没有配置id, 那么name可以作为id.
    开发中Spring和Struts1整合的时候, /login.
    <bean name=”/login” class=””>

    现在的开发中都使用id属性即可.


    类的作用范围:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    scope属性 :

    - singleton : 单例的.(默认的值.)
    - prototype : 多例的.
    - request :web开发中. 创建了一个对象, 将这个对象存入request范围, request.setAttribute();
    - session :web开发中. 创建了一个对象, 将这个对象存入session范围, session.setAttribute();
    - globalSession : 一般用于Porlet应用环境. 指的是分布式开发. 不是porlet环境, globalSession等同于session;


    实际开发中主要使用singleton, prototype


> Bean的生命周期:   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

配置Bean的初始化和销毁的方法:
配置初始化和销毁的方法:

- init-method=”setup”
- destroy-method=”teardown”

执行销毁的时候, 必须手动关闭工厂, 而且只对scope=”singleton”有效.

Bean的生命周期的11个步骤:
1.instantiate bean对象实例化
2.populate properties 封装属性

03. 如果Bean实现BeanNameAware 执行 setBeanName
04. 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
05. 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
06. 如果Bean实现InitializingBean 执行 afterPropertiesSet
07. 调用<bean init-method="init"> 指定初始化方法 init
08. 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
09. 执行业务处理
10. 如果Bean实现 DisposableBean 执行 destroy
11. 调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy


在CustomerService类的add方法之前进行权限校验?


1.5IOC装配Bean(注解方式)

  1. 1Spring的注解装配Bean

    Spring2.5 引入使用注解去定义Bean
    @Component 描述Spring框架中Bean

- Spring的框架中提供了与@Component注解等效的三个注解:  
    - @Repository 用于对DAO实现类进行标注
    - @Service 用于对Service实现类进行标注
    - @Controller 用于对Controller实现类进行标注  

     > 三个注解为了后续版本进行增强的.  
  1. Bean的属性注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
普通属性;
@Value(value="itcast")
private String info;

对象属性:
@Autowired:自动装配默认使用类型注入.
@Autowired
@Qualifier("userDao") --- 按名称进行注入.

@Autowired
@Qualifier("userDao")
private UserDao userDao;
等价于
@Resource(name="userDao")
private UserDao userDao;
  1. Bean其他的属性的配置
1
2
3
4
5
6
7
8
9
10

配置Bean初始化方法和销毁方法:

* init-method 和 destroy-method.

@PostConstruct 初始化
@PreDestroy 销毁

配置Bean的作用范围:
@Scope

Spring整合web开发

– 正常整合Servlet和Spring没有问题的, 但是每次执行Servlet的时候加载Spring配置, 加载Spring环境.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

* 解决办法:在Servlet的init方法中加载Spring配置文件?
* 当前这个Servlet可以使用,但是其他的Servlet的用不了了!!!
* 将加载的信息内容放到ServletContext中.ServletContext对象时全局的对象.服务器启动的时候创建的.在创建ServletContext的时候就加载Spring的环境.
* ServletContextListener:用于监听ServletContext对象的创建和销毁的.

在web.xml中配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>

修改程序的代码:
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
WebApplicationContext applicationContext = (WebApplicationContext) getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

Spring集成JUnit测试

  1. 程序中有Junit环境.
  2. 导入一个jar包.spring与junit整合jar包.
- spring-test-3.2.0.RELEASE.jar  
  1. 测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest {

@Autowired
private UserService userService;

@Test
public void demo1(){
userService.sayHello();
}

}


----------

微信公众号


欢迎关注公众号“云栖简码”