博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Spring框架]Spring开发实例: XML+注解.
阅读量:6417 次
发布时间:2019-06-23

本文共 8997 字,大约阅读时间需要 29 分钟。

前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识.

一. Spring概述

1.1,什么是Spring:
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为  应用程序开发提供集成的框架。Spring使用基本的来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是()和面向切面()。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 开源框架。

 

1.2, 为什么需要学习Spring

方便解耦,简化开发

Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理

AOP编程的支持

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

声明式事务的支持

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

方便程序的测试

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

方便集成各种优秀框架

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

降低JavaEE API的使用难度

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

二, Spring IOC 的快速入门
上一篇文章: http://www.cnblogs.com/wang-meng/p/5597490.html 已经对于IOC 的概念有了深入的解析, 在这里就不再赘述了, 直接说IOC 的快速开发.
2,1 快速开发入门
步骤一: 下载Spring的开发包:
为了方便大家开发, 我已经将spring-framework-3.2.4.RELEASE-dist.zip spring-framework-3.0.2.RELEASE-dependencies.zip上传至我的网盘. 地址如下:
链接:http://pan.baidu.com/s/1slqvOzb 密码:ikgn
步骤二: 了解Spring的目录结构:

docs        :Spring的开发文档libs        :Spring的开发包.schema      :约束文档.

步骤三: 创建一个项目,引入jar包:
步骤四: 引入Spring的配置文件:

1 在src下创建一个applicationContext.xml 2 引入约束: 3 
6 7
8 9 编写标签:10

骤五: 编写测试类:

1     @Test2     public void demo1(){3         // 创建Spring的工厂类:4         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");5         CustomerService customerService = (CustomerService) applicationContext6                 .getBean("customerService");7         customerService.sayHello();8     }

 

2.2 IOC及DI

IOC: Inverse of Controller 控制反转.将Bean 创建反转给Spring容器.
DI: Dependency Injection 依赖注入.在Spring创建这个类的过程中,将这个类的依赖的属性注入进去.
2.3 Spring的工厂类

ApplicationContext

    |----ClassPathXmlApplicationContext :解析类路径下的XML的.

    |----FileSystemXmlApplicationContext :解析本地磁盘上的XML的.

 

 

BeanFactory和ApplicationContext都是Spring中的工厂:

    BeanFactory是Spring老版本的工厂类:

         * 第一次调用getBean方法的时候实例化类.

    ApplicationContext是Spring新版本的工厂类:

        * 在加载核心配置文件的时候,将所有的类实例化.

三, Spring的Bean管理(基于XML方式)

 3.1 Spring实例化Bean的方式

无参数构造方式(最常用)

1     
2
3 4 @Test 5 /** 6 * 无参数构造 7 */ 8 public void demo1() { 9 // 加载核心配置文件:10 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(11 "applicationContext.xml");12 Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");13 System.out.println(bean1);14 }

静态工厂实例化方式:

1 Bean2的静态工厂: 2 /** 3  * Bean2的静态工厂 4  * @author jiangtao 5  * 6  */ 7 public class Bean2Factory { 8  9     public static Bean2 getBean2(){10         return new Bean2();11     }12 }13 14 配置文件:15     
16
17 18 代码:19 @Test20 /**21 * 静态工厂实例化22 */23 public void demo2() {24 // 加载核心配置文件:25 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(26 "applicationContext.xml");27 Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");28 System.out.println(bean2);29 }

实例工厂实例化方式:

1 实例工厂: 2 public class Bean3Factory { 3  4     public Bean3 getBean3(){ 5         System.out.println("实例工厂执行了..."); 6         return new Bean3(); 7     } 8 } 9 10 配置文件:11     
12
13
14 15 代码:16 @Test17 /**18 * 实例工厂实例化19 */20 public void demo3() {21 // 加载核心配置文件:22 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(23 "applicationContext.xml");24 Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");25 System.out.println(bean3);26 }

 

3.2,  SpringBean的常用的配置:

<bean>标签的idname属性:

id和name有什么区别?

id :使用XML约束中ID约束.不可以出现特殊字符.

name:出现特殊字符.如果使用了name没有id,那么name可以作为id使用.

Spring整合Struts1:  <bean name=”/login” class=””/>

<bean>上的生命周期的配置:

1     @Test 2     /** 3      * Bean的生命周期的相关配置: 4      *     * init-method 5      *     * destory-method :只能针对单例对象有效.必须在工厂关闭之后才会销毁对象. 6      */ 7     public void demo1(){ 8         ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 9         EmployeeService employeeService = (EmployeeService) applicationContext10                 .getBean("employeeService");11         employeeService.save();12         applicationContext.close();13     }

<bean>上的作用范围的配置:|

scope属性:

* singleton :单例的.(默认)

* prototype :多例的.

* request :WEB项目中,创建一个对象,保存到request域中.

* session :WEB项目中,创建一个对象,保存到session域中.

* globalsession :WEB项目中,特殊环境.分布式开发环境.如果没有分布式环境,相当于session.

3.3 Bean的生命周期:

Spring实例化Bean的过程中总共完成11个步骤:

1.instantiate bean对象实例化

2.populate properties 封装属性

3.如果Bean实现BeanNameAware 执行 setBeanName

4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext

5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization

6.如果Bean实现InitializingBean 执行 afterPropertiesSet

7.调用<bean init-method="init"> 指定初始化方法 init

8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization

9.执行业务处理

10.如果Bean实现 DisposableBean 执行 destroy

11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

第三步和第四步:主要让生成Bean了解Spring容器.

第五步和第八步:允许客户在Bean的生成过程中对Bean的实例进行增强.

* BeanPostProcessor:工厂勾子.允许客户在生成类的过程中对类进行增强.

四, Spring的属性注入:

4.1 构造方法的属性注入:

1 
2 3
5   
7   
9

4.2 Set方法的属性注入:

1 
2 3
5  
7   
9

4.3 Spring2.5支持p名称空间的注入:

P名称空间的语法:

语法:

* 普通属性:   p:name=””

* 对象类型属性:  p:name-ref=””

 

 

P名称空间的使用:

1 引入p名称空间: 2  3 
10 11 12 13
14 15
16 17

4.4 Spring3.0SpEL的属性注入(SpEL:Spring Expression Language)

SpEL的语法:

语法:#{SpEL}

 

SpEL的用法:

1 
2 3
1 
2 3
5   
7   
9
10 11 12 13
15  
17   
19

 

4.5 Spring中的数组或集合的属性的注入: 1 <!--数组属性的注入:-->

2  3 
5   
7     
老马
9     
马凤
11     
马如花
13   
15
16 17
19
21   
23     
马芙蓉
25     
马大帅
27     
马大彪
29   
31
32 33
35
37   
39     
马云
41     
马化腾
43     
马大哈
45   
46 47
48 49
51
53   
55     
57     
59    
61  
63
64 65
67
69   
71     
root
73     
123
75   
77

4.6 Spring中的分配置文件进行开发:

加载配置文件的时候加载多个配置文件:

1 @Test 2  3 /** 4  5  * 在加载配置文件的时候,加载多个配置文件 6  7  */ 8  9 public void demo2() {10 11     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml", "applicationContext2.xml");12 13     CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean");14 15     System.out.println(collectionBean);16 17 }

总配置文件中引入其他配置文件:

 1 <import resource="applicationContext2.xml"/> 

1 @Test 2  3 /** 4  5  * 在一个配置文件中引入其他的配置文件 6  7  */ 8  9 public void demo3() {10 11   ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");14 15   CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean");18 19   System.out.println(collectionBean);20 21 }

 

五, SpringBean管理(基于注解方式)

5.1 Spring的注解的快速入门:

步骤一:创建项目,引入jar:

步骤二:引入spring的配置文件:

如果使用Spring的注解的开发,需要引入context约束!!!

1 

步骤三:创建包和类:

* cn.augmentum.spring.demo1* UserService* UserServiceImpl

步骤四:在类上配置一个注解:

1 @Component(value="userService")2 3 相当于:4 5 

步骤五:Spring中开启注解扫描:

1 

5.2 SpringIOC的注解详解:

@Component:组件.

Spring提供了@Component的注解的一些衍生注解:

* @Controller :

* @Service :

* @Repository :

@Value:注入普通类型的属性.

@Value(value=”张三”)private String name;

@Autowired

默认按类型完成属性的注入:

* 但是我们习惯采用按名称注入.

* 强制使用按名称的方式完成属性的注入:

* @Qulifer(value=”名称”)

@Resource:

@Resource注解相当于:

* @Autowired@Qulifer一起使用完成按名称的属性注入.

5.3 SpringIOC的其他的注解:

@PostConstruct:

相当于init-method

@PreDestory:

相当于destory-method

@Scope:

相当于scope属性:

* singleton

* prototype

* request

* session

* globalSession

5.4 Spring3.0基于JavaConfig为核心的注解

JavaConfig为核心:使用Java类作为配置文件.

* 类的构造特别麻烦!!!

 

1 @Configuration 2 public class BeanConfig { 3  4     @Bean(name="car") 5     public Car showCar(){ 6  7         Car car = new Car(); 8  9         car.setName("马自达");10 11         car.setPrice(150000d);12 13         return car;14     }15 16  17 18     @Bean(name="product")19     public Product showProduct(){20 21         Product product = new Product();22 23         product.setName("空调");24 25         product.setPrice(1200d);26 27         return product;28 29     }30 31 }

 

5.5 XML和注解的比较:

XML:结构清晰.(Bean管理由Spring控制.)

注解:开发便捷.(属性注入:不需要提供set方法.)

 

企业中通常还有一种开发方式:XML和注解的整合开发.

* XML用于管理Bean.

* 注解用于属性注入.

需要在配置文件中开启注解配置:

<context:annotation-config/>

Bean交给Spring进行管理.属性注入由注解完成.

到了这里就说完了Spring IOC的相关知识, 准备下一篇文章总结下AOP的相关知识. 

 

你可能感兴趣的文章
mysql日期函数(转)
查看>>
REST API用得也痛苦
查看>>
给textbox的text赋中文值,页面提交后,该textbox的默认text值如何变成乱码了
查看>>
test for windows live writer plugins
查看>>
Tiny210 U-BOOT(二)----配置时钟频率基本原理
查看>>
Java中字符串相等与大小比较
查看>>
文字超过字符长度 显示… 点点点 jquery
查看>>
读javascript高级程序设计14-错误处理与调试
查看>>
代理模式
查看>>
javaweb学习总结(二十四)——jsp传统标签开发
查看>>
让script的type属性等于text/html
查看>>
[Docker] Docker Machine intro
查看>>
HA 高可用软件系统保养指南
查看>>
linux 文件系统sysvinit 流程分析
查看>>
体素科技:2018年,算法驱动下的医学影像分析进展
查看>>
Vue 折腾记 - (8) 写一个挺靠谱的多地区选择组件
查看>>
VS Code折腾记 - (3) 多图解VSCode基础功能
查看>>
再不懂区块链,你就OUT了!
查看>>
教你玩转自定义View—手撸一个倒计时控件如此简单
查看>>
『翻译』Node.js 调试
查看>>