一、HelloWorld

    需要的jar文件(以2.5.5为例):spring.jar,common-logging.jar

  1.新建类com.kdyzm.spring.helloworld.HelloWorld.java

  1. package com.kdyzm.spring.helloworld;
  2.  
  3. public class HelloWorld {
  4. public void say(){
  5. System.out.println("Hello,World!");
  6. }
  7. }

HelloWorld

  2.新建配置文件com.kdyzm.spring.helloworld.applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  6. <!-- 注册HelloWorld -->
  7. <bean id="helloWorld" class="com.kdyzm.spring.helloworld.HelloWorld"></bean>
  8. </beans>

com.kdyzm.spring.helloworld.applicationContext.xml

    beans标签:对应着spring容器。

    bean标签:对应着一个类,id是唯一标识符,class是类路径。

  3.新建测试文件HelloWorld.spring.HelloWorldTest.java

  1. package com.kdyzm.spring.helloworld;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. public class HelloWorldTest {
  7. public static void main(String[] args) {
  8. //测试HelloWorld
  9. ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/helloworld/applicationContext.xml");
  10. HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
  11. helloWorld.say();
  12. }
  13. }

com.kdyzm.spring.helloworld.HelloWorldTest.java

  4.运行结果:

    Hello,World!

二、别名

  在beans标签下,使用alias标签为bean指定别名,指定别名的好处就是在不同的模块下使用不同的名字,增强可读性。

  1.    <bean id="helloWorld" class="com.kdyzm.spring.helloworld.HelloWorld"></bean>
  2. <alias name="helloWorld" alias="狗蛋"/>
  3. <alias name="helloWorld" alias="张三"/>

  测试:

  1. ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/helloworld/applicationContext.xml");
  2. HelloWorld helloWorld=(HelloWorld) context.getBean("狗蛋");
  3. helloWorld.say();

三、spring创建对象

  1.spring默认在启动spring容器的时候见所有bean都提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext会自动创建并且配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中在有任何错误能够立即发现。

    使用lazy-init="true"属性能够开启懒加载,这样初始化bean的时候的时机就变为在调用类中方法的时候。默认为false,禁用懒加载。

  2.使用静态工厂方法创建对象

    (1)首先创建一个工厂类com.kdyzm.spring.helloworld.HelloWorldFactory.java

  1. package com.kdyzm.spring.helloworld;
  2. /*
  3. * 静态工厂类
  4. */
  5. public class HelloWorldFactory {
  6. public static HelloWorld getInstance(){
  7. return new HelloWorld();
  8. }
  9. }

com.kdyzm.spring.helloworld.HelloWorldFactory.java

    (2)在com.kdyzm.spring.helloworld.applicationContext.xml配置文件中配置

  1. <bean id="helloWorldFactory" class="com.kdyzm.spring.helloworld.HelloWorldFactory" factory-method="getInstance"></bean>

      使用factory-method属性声明使用工厂里的那个方法生成目标对象

    (3)测试

  1. ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/helloworld/applicationContext.xml");
  2. HelloWorld helloWorld=(HelloWorld) context.getBean("helloWorldFactory");
  3. helloWorld.say();

     直接使用getBean方法获取HelloWorld对象即可。

  3.默认情况下使用spring创建对象是单例模式,这种方式创建独享非常容易出现安全性问题。使用bean标签的scope属性解决该问题。

    * singleton:默认的方式,单例,属性共享(一般情况下应当将数据放到方法的变量中)

    * prototype:多例,当一个bean是多例模式的情况下,lazy-init为false或者default无效,也就是说懒加载强制开启。

    配置示例:

  1. <bean id="helloWorld" class="com.kdyzm.spring.scope.HelloWorld" scope="prototype"></bean>

    一旦使用多例模式,创建的每个对象在内存中都是独一无二的。

  4.指定Bean的初始化方法和销毁方法。

    spring在初始化bean或者销毁bean的时候有时候需要做一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。

    applicationContext.xml配置:

  1. <bean id="helloWorld"
  2. class="com.kdyzm.spring.createObject.HelloWorld"
  3. init-method="init"
  4. destroy-method="destroy"
  5. >
  6. </bean>

    HelloWorld配置:

  1. package com.kdyzm.spring.createObject;
  2.  
  3. public class HelloWorld {
  4. public void init(){
  5. System.out.println("初始化方法被调用!");
  6. }
  7. public HelloWorld() {
  8. System.out.println("构造方法被调用!");
  9. }
  10. public void say(){
  11. System.out.println("HelloWorld!");
  12. }
  13. public void destroy(){
  14. System.out.println("销毁方法被调用!");
  15. }
  16. }

com.kdyzm.spring.createObject.HelloWorld.java

    测试方法:

  1. ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/createObject/applicationContext.xml");
  2. System.out.println("spring容器已经启动!");
  3. HelloWorld helloWorld=(HelloWorld) context.getBean("helloWorld");
  4. helloWorld.say();
  5. ClassPathXmlApplicationContext applicationContext=(ClassPathXmlApplicationContext)context;
  6. applicationContext.close();

    将ApplicationContext的引用对象转换成ClassPathXmlApplicationContext对象,调用close方法之后对象才会调用destroy方法。

    总结:

      * init-method:该方法被spring容器执行,在构造方法之后执行,如果需要在构造方法之后,调用方法之前做一些工作,可以在init方法中完成。

      * destroy-method:

          如果该bean是单例的,则在spring容器关闭或者销毁的时候,执行该方法

          如果该bean是多例的,则spring容器不负责销毁。

      所以,要想让spring容器控制住bean的生命周期,那么该bean必须是单例的;如果该bean是多例的,那么关闭资源的操作应当由程序员完成。

四、依赖注入(DI)

    什么是依赖注入:当使用spring创建对象的同时给对象中的属性赋初值。

  1.使用构造器注入

    (1)可以通过参数的顺序依次确定给其赋初值

  1. <constructor-arg index="0">
  2. <value>张三</value>
  3. </constructor-arg>
  4. <constructor-arg index="1">
  5. <value>56</value>
  6. </constructor-arg>

    (2)可以通过参数的类型给其赋初值

  1. <constructor-arg type="java.lang.Integer">
  2. <value>56</value>
  3. </constructor-arg>
  4. <constructor-arg type="java.lang.String">
  5. <value>张三</value>
  6. </constructor-arg>

    (3)可以根据参数的顺序和类型共同确定某个属性

  1. <bean id="person" class="com.kdyzm.spring.di.Person">
  2. <constructor-arg index="0" type="java.lang.String" value="小强"></constructor-arg>
  3. <constructor-arg index="1" type="java.lang.String" value="12110501001"></constructor-arg>
  4. </bean>

    测试(3):

  1. package com.kdyzm.spring.di;
  2.  
  3. public class HelloWorld {
  4. private String name;
  5. private Person p;
  6.  
  7. public HelloWorld(String name, Person p) {
  8. this.name = name;
  9. this.p = p;
  10. }
  11. public HelloWorld() {
  12. System.out.println("HelloWorld对象被创建!");
  13. }
  14. public void say() {
  15. System.out.println(name+":"+p);
  16. }
  17. }

com.kdyzm.spring.di.HelloWorld.java

  1. package com.kdyzm.spring.di;
  2.  
  3. public class Person {
  4. private String name;
  5. private String id;
  6. public Person(String name, String id) {
  7. this.name = name;
  8. this.id = id;
  9. }
  10. public Person() {
  11. }
  12. @Override
  13. public String toString() {
  14. return "Person [name=" + name + ", id=" + id + "]";
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getId() {
  23. return id;
  24. }
  25. public void setId(String id) {
  26. this.id = id;
  27. }
  28. }

com.kdyzm.spring.di.Person.java

    测试代码:

  1. ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/di/applicationContext.xml");
  2. HelloWorld helloWorld=(HelloWorld) context.getBean("helloWorld");
  3. helloWorld.say();

    运行结果:

  1. 狗蛋:Person [name=小强, id=12110501001]

  2.使用setting方法进行注入(推荐使用的方法)

    (1)简单的数据类型:包装类型和String

  1. <bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl">
  2. <!-- 基本类型,string类型 -->
  3. <property name="age" value="20"></property>
  4. <property name="name" value="张无忌"></property> </bean>

    (2)引用其它bean

  1. <bean id="person" class="com.itcast.bean.Person" />
  2. <bean id="personService" class="com.itcast.bean.impl.PersonServiceImpl">
  3. <property name="person" ref="person" />
  4. </bean>

    (3)装配List集合。

  1. <property name="lists">
  2. <list>
  3. <value>list1</value>
  4. <value>list2</value>
  5. <ref bean="student"/>
  6. </list>
  7. </property>

    (4)装配Set集合

  1. <property name="sets">
  2. <set>
  3. <value>set1</value>
  4. <value>set2</value>
  5. <ref bean="student"/>
  6. </set>
  7. </property>

    (5)装配Map

  1. <property name="maps">
  2. <map>
  3. <entry key="01">
  4. <value>map01</value>
  5. </entry>
  6. <entry key="02">
  7. <value>map02</value>
  8. </entry>
  9. </map>
  10. </property>

    (6)装配Properties

  1. <property name="props">
  2. <props>
  3. <prop key="01">prop1</prop>
  4. <prop key="02">prop2</prop>
  5. </props>
  6. </property>

    (7)小练习:

  1. package com.kdyzm.spring.di.setting;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6.  
  7. public class Person {
  8. private String name;
  9. private Integer num;
  10. private Student student;
  11. private List<Student>list;
  12. private Set<Student>set;
  13. private Map<String,Student>map;
  14. public Person() {
  15. System.out.println("Person对象被创建!");
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public void setNum(Integer num) {
  21. this.num = num;
  22. }
  23. public void setStudent(Student student) {
  24. this.student = student;
  25. }
  26. public void setList(List<Student> list) {
  27. this.list = list;
  28. }
  29. public void setSet(Set<Student> set) {
  30. this.set = set;
  31. }
  32. public void setMap(Map<String, Student> map) {
  33. this.map = map;
  34. }
  35. @Override
  36. public String toString() {
  37. return "Person [name=" + name + ", num=" + num + ", student=" + student
  38. + ", list=" + list + ", set=" + set + ", map=" + map + "]";
  39. }
  40. }

com.kdyzm.spring.di.setting.Person.java

  1. package com.kdyzm.spring.di.setting;
  2.  
  3. public class Student {
  4. private String id;
  5. private String name;
  6. public Student(String id, String name) {
  7. this.id = id;
  8. this.name = name;
  9. }
  10. public Student() {
  11. System.out.println("Student对象被创建!");
  12. }
  13. @Override
  14. public String toString() {
  15. return "Student [id=" + id + ", name=" + name + "]";
  16. }
  17. public String getId() {
  18. return id;
  19. }
  20. public void setId(String id) {
  21. this.id = id;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. }

com.kdyzm.spring.di.setting.Student.java

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  6. <bean id="person" class="com.kdyzm.spring.di.setting.Person">
  7. <property name="name" value="小黄"></property>
  8. <property name="num" value="123456"></property>
  9. <property name="student" ref="student"></property>
  10. <property name="list">
  11. <list>
  12. <ref bean="student"/>
  13. <ref bean="student"/>
  14. </list>
  15. </property>
  16. <property name="set">
  17. <set>
  18. <ref bean="student"/>
  19. <ref bean="student"/>
  20. </set>
  21. </property>
  22. <property name="map">
  23. <map>
  24. <entry key="张三" value-ref="student"></entry>
  25. <entry key="李四" value-ref="student"></entry>
  26. <entry key="王五" value-ref="student"></entry>
  27. </map>
  28. </property>
  29. </bean>
  30. <bean id="student" class="com.kdyzm.spring.di.setting.Student">
  31. <property name="id" value="1"></property>
  32. <property name="name" value="小强"></property>
  33. </bean>
  34. </beans>

com.kdyzm.spring.di.setting.applicationContext.xml

      测试代码:

  1. ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/di/setting/applicationContext.xml");
  2. Person person=(Person) context.getBean("person");
  3. System.out.println(person);

      运行结果:

  1. Person对象被创建!
  2. Student对象被创建!
  3. 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学习第一天】【基本配置】的更多相关文章

  1. Java架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  2. Spring学习(十九)----- Spring的五种事务配置详解

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  3. 201521123006 《Java程序设计》第1周学习总结

    1. 本章学习总结 (1)java在使用的过程中可以发现其本身有着许多为了节约资源而作的设计,而java根据其应用领域分为了三大平台:Java SE.Java ME与Java EE.在本周的学习中我们 ...

  4. ## 20155336 2016-2017-2《JAVA程序设计》第十周学习总结

    20155336 2016-2017-2<JAVA程序设计>第十周学习总结 学习任务 完成学习资源中相关内容的学习 参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学号 ...

  5. Java ee第一周的作业

    这学期目标:对Java ee 进行一定程度的学习,希望最后自己能尽可能掌握Java ee的知识 企业及应用的特点:企业级的应用通常比较庞大,而且其中的数据需要保密. Java ee 框架图

  6. 【转载】开发者眼中的Spring与Java EE

    转载自:http://www.infoq.com/cn/news/2015/07/spring-javaee 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵 ...

  7. Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】

    通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XML 的功能,也提供了自动装配的功能,采用了 ...

  8. Java EE发展史

    前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...

  9. Java EE启示录

    前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...

随机推荐

  1. Pycharm如何添加第三方库和插件

    首先打开Pycharm,点击左上角  >>File  >>Setting . 打开之后点击 >>PRoject :untitled   >>Projec ...

  2. 快速上手php:使用PhpStrom部署项目

    闲话 上学的时候一直以为可以专注自己的领域,以为与php无缘的,但是这种想法是错误,在完成任务的时候,你不得不使用你不熟悉的语言或者框架.正所谓业务驱动开发,这次接手已经离职的前辈的留下来的项目,最蛋 ...

  3. spoj 371 Boxes

    N个盒子围成一圈,第i个盒子初始时有Ai个小球,每次可以把一个小球从一个盒子移到相邻的两个盒子之一里.问最少移动多少次使得每个盒子中小球的个数不超过1. ΣAi<=N.1<=N<=1 ...

  4. AI贪吃蛇(二)

    前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...

  5. Linux 远程复制文件

    Linux 远程复制文件 如果想把机器A上面的dir目录下面的所有文件复制到机器B的dir目录下,我们可以使用nc命令来完成 在机器A的dir目录下面执行: tar -czf - * | nc -l ...

  6. System类和Random类

    System类 成员方法: public static void gc():运行垃圾回收器 public static void exit(int status):退出垃圾回收器 public sta ...

  7. J2EE学习路线图

    一:J2SE 面向对象-封装.继承.多态 内存的分析 递归 集合类.泛型.自动打包与解包.Annotation IO 多线程.线程同步 TCP/UDP AWT.事件模型.匿名类 正则表达式 反射机制 ...

  8. 文件夹锁定(Source)

    文件夹锁定(Source)private void Lock(string folderPath){    try    {        string adminUserName = Environ ...

  9. Apache Shiro 学习记录1

    最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...

  10. maven install Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project web_nanchang

    maven打包成war时,报错:Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default- ...