【Java EE 学习 49 上】【Spring学习第一天】【基本配置】
一、HelloWorld
需要的jar文件(以2.5.5为例):spring.jar,common-logging.jar
1.新建类com.kdyzm.spring.helloworld.HelloWorld.java
package com.kdyzm.spring.helloworld; public class HelloWorld {
public void say(){
System.out.println("Hello,World!");
}
}
HelloWorld
2.新建配置文件com.kdyzm.spring.helloworld.applicationContext.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-2.5.xsd">
<!-- 注册HelloWorld -->
<bean id="helloWorld" class="com.kdyzm.spring.helloworld.HelloWorld"></bean>
</beans>
com.kdyzm.spring.helloworld.applicationContext.xml
beans标签:对应着spring容器。
bean标签:对应着一个类,id是唯一标识符,class是类路径。
3.新建测试文件HelloWorld.spring.HelloWorldTest.java
package com.kdyzm.spring.helloworld; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class HelloWorldTest {
public static void main(String[] args) {
//测试HelloWorld
ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/helloworld/applicationContext.xml");
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
helloWorld.say();
}
}
com.kdyzm.spring.helloworld.HelloWorldTest.java
4.运行结果:
Hello,World!
二、别名
在beans标签下,使用alias标签为bean指定别名,指定别名的好处就是在不同的模块下使用不同的名字,增强可读性。
<bean id="helloWorld" class="com.kdyzm.spring.helloworld.HelloWorld"></bean>
<alias name="helloWorld" alias="狗蛋"/>
<alias name="helloWorld" alias="张三"/>
测试:
ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/helloworld/applicationContext.xml");
HelloWorld helloWorld=(HelloWorld) context.getBean("狗蛋");
helloWorld.say();
三、spring创建对象
1.spring默认在启动spring容器的时候见所有bean都提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext会自动创建并且配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中在有任何错误能够立即发现。
使用lazy-init="true"属性能够开启懒加载,这样初始化bean的时候的时机就变为在调用类中方法的时候。默认为false,禁用懒加载。
2.使用静态工厂方法创建对象
(1)首先创建一个工厂类com.kdyzm.spring.helloworld.HelloWorldFactory.java
package com.kdyzm.spring.helloworld;
/*
* 静态工厂类
*/
public class HelloWorldFactory {
public static HelloWorld getInstance(){
return new HelloWorld();
}
}
com.kdyzm.spring.helloworld.HelloWorldFactory.java
(2)在com.kdyzm.spring.helloworld.applicationContext.xml配置文件中配置
<bean id="helloWorldFactory" class="com.kdyzm.spring.helloworld.HelloWorldFactory" factory-method="getInstance"></bean>
使用factory-method属性声明使用工厂里的那个方法生成目标对象
(3)测试
ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/helloworld/applicationContext.xml");
HelloWorld helloWorld=(HelloWorld) context.getBean("helloWorldFactory");
helloWorld.say();
直接使用getBean方法获取HelloWorld对象即可。
3.默认情况下使用spring创建对象是单例模式,这种方式创建独享非常容易出现安全性问题。使用bean标签的scope属性解决该问题。
* singleton:默认的方式,单例,属性共享(一般情况下应当将数据放到方法的变量中)
* prototype:多例,当一个bean是多例模式的情况下,lazy-init为false或者default无效,也就是说懒加载强制开启。
配置示例:
<bean id="helloWorld" class="com.kdyzm.spring.scope.HelloWorld" scope="prototype"></bean>
一旦使用多例模式,创建的每个对象在内存中都是独一无二的。
4.指定Bean的初始化方法和销毁方法。
spring在初始化bean或者销毁bean的时候有时候需要做一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。
applicationContext.xml配置:
<bean id="helloWorld"
class="com.kdyzm.spring.createObject.HelloWorld"
init-method="init"
destroy-method="destroy"
>
</bean>
HelloWorld配置:
package com.kdyzm.spring.createObject; public class HelloWorld {
public void init(){
System.out.println("初始化方法被调用!");
}
public HelloWorld() {
System.out.println("构造方法被调用!");
}
public void say(){
System.out.println("HelloWorld!");
}
public void destroy(){
System.out.println("销毁方法被调用!");
}
}
com.kdyzm.spring.createObject.HelloWorld.java
测试方法:
ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/createObject/applicationContext.xml");
System.out.println("spring容器已经启动!");
HelloWorld helloWorld=(HelloWorld) context.getBean("helloWorld");
helloWorld.say();
ClassPathXmlApplicationContext applicationContext=(ClassPathXmlApplicationContext)context;
applicationContext.close();
将ApplicationContext的引用对象转换成ClassPathXmlApplicationContext对象,调用close方法之后对象才会调用destroy方法。
总结:
* init-method:该方法被spring容器执行,在构造方法之后执行,如果需要在构造方法之后,调用方法之前做一些工作,可以在init方法中完成。
* destroy-method:
如果该bean是单例的,则在spring容器关闭或者销毁的时候,执行该方法
如果该bean是多例的,则spring容器不负责销毁。
所以,要想让spring容器控制住bean的生命周期,那么该bean必须是单例的;如果该bean是多例的,那么关闭资源的操作应当由程序员完成。
四、依赖注入(DI)
什么是依赖注入:当使用spring创建对象的同时给对象中的属性赋初值。
1.使用构造器注入
(1)可以通过参数的顺序依次确定给其赋初值
<constructor-arg index="0">
<value>张三</value>
</constructor-arg>
<constructor-arg index="1">
<value>56</value>
</constructor-arg>
(2)可以通过参数的类型给其赋初值
<constructor-arg type="java.lang.Integer">
<value>56</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>张三</value>
</constructor-arg>
(3)可以根据参数的顺序和类型共同确定某个属性
<bean id="person" class="com.kdyzm.spring.di.Person">
<constructor-arg index="0" type="java.lang.String" value="小强"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="12110501001"></constructor-arg>
</bean>
测试(3):
package com.kdyzm.spring.di; public class HelloWorld {
private String name;
private Person p; public HelloWorld(String name, Person p) {
this.name = name;
this.p = p;
}
public HelloWorld() {
System.out.println("HelloWorld对象被创建!");
}
public void say() {
System.out.println(name+":"+p);
}
}
com.kdyzm.spring.di.HelloWorld.java
package com.kdyzm.spring.di; public class Person {
private String name;
private String id;
public Person(String name, String id) {
this.name = name;
this.id = id;
}
public Person() {
}
@Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
com.kdyzm.spring.di.Person.java
测试代码:
ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/di/applicationContext.xml");
HelloWorld helloWorld=(HelloWorld) context.getBean("helloWorld");
helloWorld.say();
运行结果:
狗蛋:Person [name=小强, id=12110501001]
2.使用setting方法进行注入(推荐使用的方法)
(1)简单的数据类型:包装类型和String
<bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl">
<!-- 基本类型,string类型 -->
<property name="age" value="20"></property>
<property name="name" value="张无忌"></property> </bean>
(2)引用其它bean
<bean id="person" class="com.itcast.bean.Person" />
<bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl">
<property name="person" ref="person" />
</bean>
(3)装配List集合。
<property name="lists">
<list>
<value>list1</value>
<value>list2</value>
<ref bean="student"/>
</list>
</property>
(4)装配Set集合
<property name="sets">
<set>
<value>set1</value>
<value>set2</value>
<ref bean="student"/>
</set>
</property>
(5)装配Map
<property name="maps">
<map>
<entry key="01">
<value>map01</value>
</entry>
<entry key="02">
<value>map02</value>
</entry>
</map>
</property>
(6)装配Properties
<property name="props">
<props>
<prop key="01">prop1</prop>
<prop key="02">prop2</prop>
</props>
</property>
(7)小练习:
package com.kdyzm.spring.di.setting; import java.util.List;
import java.util.Map;
import java.util.Set; public class Person {
private String name;
private Integer num;
private Student student;
private List<Student>list;
private Set<Student>set;
private Map<String,Student>map;
public Person() {
System.out.println("Person对象被创建!");
}
public void setName(String name) {
this.name = name;
}
public void setNum(Integer num) {
this.num = num;
}
public void setStudent(Student student) {
this.student = student;
}
public void setList(List<Student> list) {
this.list = list;
}
public void setSet(Set<Student> set) {
this.set = set;
}
public void setMap(Map<String, Student> map) {
this.map = map;
}
@Override
public String toString() {
return "Person [name=" + name + ", num=" + num + ", student=" + student
+ ", list=" + list + ", set=" + set + ", map=" + map + "]";
}
}
com.kdyzm.spring.di.setting.Person.java
package com.kdyzm.spring.di.setting; public class Student {
private String id;
private String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public Student() {
System.out.println("Student对象被创建!");
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
com.kdyzm.spring.di.setting.Student.java
<?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-2.5.xsd">
<bean id="person" class="com.kdyzm.spring.di.setting.Person">
<property name="name" value="小黄"></property>
<property name="num" value="123456"></property>
<property name="student" ref="student"></property>
<property name="list">
<list>
<ref bean="student"/>
<ref bean="student"/>
</list>
</property>
<property name="set">
<set>
<ref bean="student"/>
<ref bean="student"/>
</set>
</property>
<property name="map">
<map>
<entry key="张三" value-ref="student"></entry>
<entry key="李四" value-ref="student"></entry>
<entry key="王五" value-ref="student"></entry>
</map>
</property>
</bean>
<bean id="student" class="com.kdyzm.spring.di.setting.Student">
<property name="id" value="1"></property>
<property name="name" value="小强"></property>
</bean>
</beans>
com.kdyzm.spring.di.setting.applicationContext.xml
测试代码:
ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/di/setting/applicationContext.xml");
Person person=(Person) context.getBean("person");
System.out.println(person);
运行结果:
Person对象被创建!
Student对象被创建!
Person [name=小黄, num=123456, student=Student [id=1, name=小强], list=[Student [id=1, name=小强], Student [id=1, name=小强]], set=[Student [id=1, name=小强]], map={张三=Student [id=1, name=小强], 李四=Student [id=1, name=小强], 王五=Student [id=1, name=小强]}]
【Java EE 学习 49 上】【Spring学习第一天】【基本配置】的更多相关文章
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- Spring学习(十九)----- Spring的五种事务配置详解
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...
- 201521123006 《Java程序设计》第1周学习总结
1. 本章学习总结 (1)java在使用的过程中可以发现其本身有着许多为了节约资源而作的设计,而java根据其应用领域分为了三大平台:Java SE.Java ME与Java EE.在本周的学习中我们 ...
- ## 20155336 2016-2017-2《JAVA程序设计》第十周学习总结
20155336 2016-2017-2<JAVA程序设计>第十周学习总结 学习任务 完成学习资源中相关内容的学习 参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学号 ...
- Java ee第一周的作业
这学期目标:对Java ee 进行一定程度的学习,希望最后自己能尽可能掌握Java ee的知识 企业及应用的特点:企业级的应用通常比较庞大,而且其中的数据需要保密. Java ee 框架图
- 【转载】开发者眼中的Spring与Java EE
转载自:http://www.infoq.com/cn/news/2015/07/spring-javaee 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵 ...
- Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了 ...
- Java EE发展史
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...
- Java EE启示录
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...
随机推荐
- Windows7SP1补丁包(Win7补丁汇总) 32位/64位版 更新截至2016年11月
Windows7SP1(64位)补丁包(Win7补丁汇总)更新到本月最新.包含Windows7SP1中文版所有重要补丁,可离线安装,适用于Windows 7 SP1 64位 简体中文系统.包含Inte ...
- bzoj2091【Poi2010】The Minima Game
直接dp就好了 每个人肯定会去选最大的,用dp[i]表示选了后i个点时先手-后手的最大值(因为从后往前扫才好转移啊 QwQ~) dp[i]=max(c[j]-dp[j-1]),(j<=i) 直接 ...
- hackerrank Similar Pair
传送门 Problem Statement You are given a tree where each node is labeled from 1 to n. How many similar ...
- openerp7 时区问题
由于目前openerp 的时区,读取的是UTC 时间,而我国本地时间比UTC 快8小时,这个问题就导致:写入数据库的时候时间相差8小时,以及Openerp日志输出时间格式也相差8小时和 前端显示时间的 ...
- windows下使用pip安装python的第三方lxml库
lxml是Python语言里和XML以及HTML工作的功能最丰富和最容易使用的库.lxml库的安装和python其他第三方库的安装方法是一样的,只是可能由于一些细节上的失误导致安装失败. 工具 Pyt ...
- WEKA使用
参考 http://bbs.middleware123.com/thread-24052-1-1.html 使用Weka进行数据挖掘 http://quweiprotoss.blog.163.com ...
- 加载未安装APK中的类
一.前提 目的:动态加载SD卡中Apk的类. 注意:被加载的APK是未安装的. 相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版. 截图: 成功截图: 二.准备 准备被调用A ...
- jQuery animate动画 stop()方法详解~
一.动画格式: 格式一:jQueryObject.animate( cssProperties, options ) 格式二:$('#id').animate( styles[, duration ] ...
- eclipse中SSH三大框架环境搭建<二>
通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...
- OPenCL
OpenCLhttp://baike.baidu.com/link?url=7uHWCVUYB3Sau_xh3OOKP-A08_IvmT1SJixdAXKezCuCfkzeSQDiSmesGyVGk8 ...