[Spring框架]Spring开发实例: XML+注解.
前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识.
一. Spring概述
1.1,什么是Spring:
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,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的配置文件:
在src下创建一个applicationContext.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"> </beans> 编写标签:
<bean id="customerService" class="cn.augmentum.spring.demo2.CustomerServiceImpl"></bean>
步骤五: 编写测试类:
@Test
public void demo1(){
// 创建Spring的工厂类:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = (CustomerService) applicationContext
.getBean("customerService");
customerService.sayHello();
}
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的方式
无参数构造方式(最常用)
<!-- 无参数构造方法方式 -->
<bean id="bean1" class="cn.augmentum.spring.demo3.Bean1"></bean> @Test
/**
* 无参数构造
*/
public void demo1() {
// 加载核心配置文件:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
System.out.println(bean1);
}
静态工厂实例化方式:
Bean2的静态工厂:
/**
* Bean2的静态工厂
* @author jiangtao
*
*/
public class Bean2Factory { public static Bean2 getBean2(){
return new Bean2();
}
} 配置文件:
<!-- 静态工厂实例化方式 -->
<bean id="bean2" class="cn.augmentum.spring.demo3.Bean2Factory" factory-method="getBean2"/> 代码:
@Test
/**
* 静态工厂实例化
*/
public void demo2() {
// 加载核心配置文件:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
System.out.println(bean2);
}
实例工厂实例化方式:
实例工厂:
public class Bean3Factory { public Bean3 getBean3(){
System.out.println("实例工厂执行了...");
return new Bean3();
}
} 配置文件:
<!-- 实例工厂实例化方式 -->
<bean id="bean3Factory" class="cn.itcast.spring.demo3.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"/> 代码:
@Test
/**
* 实例工厂实例化
*/
public void demo3() {
// 加载核心配置文件:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
System.out.println(bean3);
}
3.2, Spring的Bean的常用的配置:
<bean>标签的id和name属性:
id和name有什么区别?
id :使用XML约束中ID约束.不可以出现特殊字符.
name:出现特殊字符.如果使用了name没有id,那么name可以作为id使用.
Spring整合Struts1: <bean name=”/login” class=””/>
<bean>上的生命周期的配置:
@Test
/**
* Bean的生命周期的相关配置:
* * init-method
* * destory-method :只能针对单例对象有效.必须在工厂关闭之后才会销毁对象.
*/
public void demo1(){
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeService employeeService = (EmployeeService) applicationContext
.getBean("employeeService");
employeeService.save();
applicationContext.close();
}
<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 构造方法的属性注入:
<!-- 构造方法的注入 --> <bean id="car" class="cn.augmentum.spring.demo6.Car">
<constructor-arg name="name" value="宝马"/>
<constructor-arg name="price" value="1000000"/>
</bean>
4.2 Set方法的属性注入:
<!-- set方法的属性注入 --> <bean id="car2" class="cn.augmentum.spring.demo6.Car2">
5 <property name="name" value="奇瑞QQ"/>
<property name="price" value="30000"/>
</bean>
4.3 Spring的2.5支持p名称空间的注入:
P名称空间的语法:
语法: * 普通属性: p:name=”” * 对象类型属性: p:name-ref=”” |
P名称空间的使用:
引入p名称空间: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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"> <!-- p名称空间的注入 --> <bean id="car2" class="cn.augmentum.spring.demo6.Car2" p:name="长安奔奔" p:price="25000"/> <bean id="employee" class="cn.augmentum.spring.demo6.Employee" p:name="马凤" p:car2-ref="car2"/>
4.4 Spring3.0的SpEL的属性注入(SpEL:Spring Expression Language)
SpEL的语法:
语法:#{SpEL} |
SpEL的用法:
<bean id="carInfo" class="cn.augmentum.spring.demo6.CarInfo"> </bean>
<!-- SpEL的方式的属性注入 --> <bean id="car2" class="cn.augmentum.spring.demo6.Car2">
<property name="name" value="#{carInfo.carName}"/>
<property name="price" value="#{carInfo.calculatorPrice()}"/>
</bean> <bean id="employee" class="cn.augmentum.spring.demo6.Employee">
15 <property name="name" value="涛哥"/>
<property name="car2" value="#{car2}"/>
</bean>
4.5 Spring中的数组或集合的属性的注入: 1 <!--数组属性的注入:-->
<property name="arrs">
<list>
<value>老马</value>
<value>马凤</value>
11 <value>马如花</value>
</list>
</property> <!--List集合的属性的注入:-->
<property name="list">
<list>
<value>马芙蓉</value>
<value>马大帅</value>
<value>马大彪</value>
</list>
</property> <!--Set集合的属性的注入:-->
<property name="set">
<set>
<value>马云</value>
<value>马化腾</value>
<value>马大哈</value>
</set> </property> <!--Map集合的属性的注入:-->
<property name="map">
<map>
<entry key="aaa" value="刘能"/>
<entry key="bbb" value="赵四"/>
59 <entry key="ccc" value="王五"/>
61 </map>
</property> <!--Properties的属性的注入:-->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
4.6 Spring中的分配置文件进行开发:
加载配置文件的时候加载多个配置文件:
@Test /** * 在加载配置文件的时候,加载多个配置文件 */ public void demo2() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml", "applicationContext2.xml"); CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean"); System.out.println(collectionBean); }
总配置文件中引入其他配置文件:
<import resource="applicationContext2.xml"/>
@Test /** * 在一个配置文件中引入其他的配置文件 */ public void demo3() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); CollectionBean collectionBean = (CollectionBean) applicationContext.getBean("collectionBean"); System.out.println(collectionBean); }
五, Spring的Bean管理(基于注解方式)
5.1 Spring的注解的快速入门:
步骤一:创建项目,引入jar包:
步骤二:引入spring的配置文件:
如果使用Spring的注解的开发,需要引入context约束!!!
<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">
步骤三:创建包和类:
* cn.augmentum.spring.demo1 * UserService * UserServiceImpl
步骤四:在类上配置一个注解:
@Component(value="userService") 相当于: <bean id=”userService” class=”…UserServiceImpl”/>
步骤五:在Spring中开启注解扫描:
<context:component-scan base-package="cn.augmentum.spring.demo1"/>
5.2 Spring的IOC的注解详解:
@Component:组件.
Spring提供了@Component的注解的一些衍生注解:
* @Controller :
* @Service :
* @Repository :
@Value:注入普通类型的属性.
@Value(value=”张三”) private String name;
@Autowired
默认按类型完成属性的注入:
* 但是我们习惯采用按名称注入.
* 强制使用按名称的方式完成属性的注入:
* @Qulifer(value=”名称”)
@Resource:
@Resource注解相当于:
* @Autowired和@Qulifer一起使用完成按名称的属性注入.
5.3 Spring的IOC的其他的注解:
@PostConstruct:
相当于init-method
@PreDestory:
相当于destory-method
@Scope:
相当于scope属性:
* singleton
* prototype
* request
* session
* globalSession
5.4 Spring3.0基于JavaConfig为核心的注解
以JavaConfig为核心:使用Java类作为配置文件.
* 类的构造特别麻烦!!!
@Configuration
public class BeanConfig { @Bean(name="car")
public Car showCar(){ Car car = new Car(); car.setName("马自达"); car.setPrice(150000d); return car;
} @Bean(name="product")
public Product showProduct(){ Product product = new Product(); product.setName("空调"); product.setPrice(1200d); return product; } }
5.5 XML和注解的比较:
XML:结构清晰.(Bean管理由Spring控制.)
注解:开发便捷.(属性注入:不需要提供set方法.)
企业中通常还有一种开发方式:XML和注解的整合开发.
* XML用于管理Bean.
* 注解用于属性注入.
需要在配置文件中开启注解配置:
<context:annotation-config/>
把Bean交给Spring进行管理.属性注入由注解完成.
到了这里就说完了Spring IOC的相关知识, 准备下一篇文章总结下AOP的相关知识.
[Spring框架]Spring开发实例: XML+注解.的更多相关文章
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- spring框架学习(五)注解
注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息.跟注释不同的是,注释是给我们看的,Java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制去读取 ...
- Eclipse IDE下的Spring框架使用简单实例
Eclipse IDE下的Spring框架使用简单实例 1 准备Java jdk安装. Eclipse软件安装.根据系统安装32/64版本,选择Eclipse IDE for Java Develop ...
- Spring框架入门之基于Java注解配置bean
Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...
- 跟着刚哥学习Spring框架--Spring容器(二)
Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用. Bean是S ...
- Spring框架 - Spring和Spring框架组成
Spring框架 - Spring和Spring框架组成 Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢? 本文通过这几个问题帮助你构筑Spring和Spring Framework ...
- 持久化框架Hibernate 开发实例(一)
1 Hibernate简介 Hibernate框架是一个非常流行的持久化框架,其中在web开发中占据了非常重要的地位, Hibernate作为Web应用的底层,实现了对数据库操作的封装.HIberna ...
- RDIFramework.NET -.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(WebForm版)
RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(WebForm版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之 ...
- RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)
RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(MVC版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之产品管理 ...
随机推荐
- 关于display: box 和 box-flex
这两天做手机项目,使用到这个css3新属性.现在还不为所有浏览器支持,所以使用的时候要加上前缀.使用方法见下面: html代码: <div class="s-indLine" ...
- 简单修改cramfs
首先进入root用户,确保LINUX系统下装有cramfsprogs,没有的话get-apt install cramfsprogs, 找到.cramfs文件,输入命令cramfsck -x song ...
- Django 中 如何使用 settings.py 中的常量
在用django 框架开发 python web 程序的时候 , 在模板页面经常会用到 settings.py 中设置的常量,比如MEDIA_URL, 我尝试过在模板页面用类似如下的方式 程序代码 { ...
- poj 3621 二分+spfa判负环
http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...
- java分布式事务
1.现有方案 a.atomikos b.jotm 说明:spring3.0已将jotm的支持踢掉 2.使用atomikos时的pom.xml内容 <!-- 分布式事务支持-atomikos-be ...
- Android中实现倒计时
1.需求 弹出提示的dialog,实现倒计时,结束后关闭dialog 2.dialog界面布局 <?xml version="1.0" encoding="utf- ...
- Irrlicht 鬼火
1.下载引擎 2.引入头文件 在VS2010下新建项目,项目->属性->配置属性->VC++目录 在包含目录中:添加 引擎安装目录\include\ 在库目录中:添加 引擎安装目录\ ...
- 关于Android的背景色配色小结
三基色原理:三基色是指红,绿,蓝三色,人眼对红.绿.蓝最为敏感,大多数的颜色可以通过红.绿.蓝三色按照不同的比例合成产生.同样绝大多数单色光也可以分解成红绿蓝三种色光.这是色度学的最基本原理,即三基色 ...
- linux的一些小问题
1.需要使用root权限时提示xxx is not sudoers.... 1).root用户下输入visudo 2).在打开的文件中找到 root ALL=(ALL) ALL,以xxx为用户名,添加 ...
- C++之const
C++中const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助.cons ...