一起学spring--依赖注入---简单粗暴的例子展示
2015-10-04 11:08
471 查看
欢迎进入《一起学spring》系列博文第二篇,
我们接着上一篇博文'我的第一个spring程序--简单粗暴易懂',我们讲到spring的依赖注入中的设值注入,所谓的设值注入,就是让spring容器使用setter方式来帮我们实例化相关对象,是相对“构造方法”注入来说的。我们还是采用对比的方式,用实例来说话。
一、设值注入:
1、这是不用spring的情况:
我们先来写两个类,具体见下面代码:
接下来我想让代码跑起来,好,我们来写一个main函数:
(注意,在main函数中我们的对象都是通过new的方式实例化的,下面,我们使用spring框架,直接从spring容器中获取对象,因为spring容器已经帮我们实例化好了)
2、这是使用spring的情况:
我们同样需要写两个类:Student和Book,代码和上面一样。只是main函数不同
分析一下上面这个main函数:
(1)、首先,我们肯定要创建一个spring容器
(2)、从spring容器中获取我们想要的对象stu
为什么不获取book对象,然后通过stu.setBook(book);的方式写呢?回答是:你这样的想法是没有问题的,完全行得通。而我上面这样子写也是可以的。
在Student类中,book作为Student的属性,所以需要在某个地方实例化book对象,否者会报空指针异常。可是,上面的代码中并没有看到实例化book对象的语句。为什么?具体原因等到我们看完我们的配置文件之后再讨论。
分析spring配置文件:
(1)、配置两个<bean>,目的是告诉spring容器,帮我实例化这两个类的对象,也就是student和book。
(2)、实例化两个对象之后,再帮忙把book对象作为Student类的一个属性传进去。对应的是:<property name="book" ref="bookID">(注:这里传进去的是book对象)
(ref表示:reference,引用的意思;其中name=“book”中的book需和Student类中的book属性名一样)
二、构造注入:
同样地,我们写两个类:
下面我们写一个main函数:(它和上面的设值注入的main函数相同)
看看配置文件:
请注意<constructor-arg>属性,name=“book”中的book是和Student类中的构造函数中的形参对应的。
分析:
设值注入:通过无参的构造方法来示例话,通过setter方法初始化属性。
构造注入:通过有参的构造函数实例化和初始化。
思考:似乎,使用spring框架比不使用更加麻烦了!我们这样使用spring-framework有必要吗?
回答:使用spring框架的目的不是本博文所涉及的内容,这里只是跟大家谈谈spring-framework的用法。谢谢
如果需要下载spring的jar包,请找上一篇博文最下面的链接
我们接着上一篇博文'我的第一个spring程序--简单粗暴易懂',我们讲到spring的依赖注入中的设值注入,所谓的设值注入,就是让spring容器使用setter方式来帮我们实例化相关对象,是相对“构造方法”注入来说的。我们还是采用对比的方式,用实例来说话。
一、设值注入:
1、这是不用spring的情况:
我们先来写两个类,具体见下面代码:
package com.huai.first; public class Book { public void doBookPrint(){ System.out.println("method -- doBookPrint"); } }
package com.huai.first; public class Student { private Book book; public void setBook(Book book){ this.book = book; } public void doStudentPrint(){ this.book.doBookPrint(); } }
接下来我想让代码跑起来,好,我们来写一个main函数:
package com.huai.first; public class MainTest { public static void main(String[] args) { Student stu = new Student(); Book book = new Book(); stu.setBook(book); stu.doStudentPrint(); } }好,搞定。
(注意,在main函数中我们的对象都是通过new的方式实例化的,下面,我们使用spring框架,直接从spring容器中获取对象,因为spring容器已经帮我们实例化好了)
2、这是使用spring的情况:
我们同样需要写两个类:Student和Book,代码和上面一样。只是main函数不同
package com.huai.first; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student stu = context.getBean(Student.class); stu.doStudentPrint(); } }
分析一下上面这个main函数:
(1)、首先,我们肯定要创建一个spring容器
(2)、从spring容器中获取我们想要的对象stu
为什么不获取book对象,然后通过stu.setBook(book);的方式写呢?回答是:你这样的想法是没有问题的,完全行得通。而我上面这样子写也是可以的。
在Student类中,book作为Student的属性,所以需要在某个地方实例化book对象,否者会报空指针异常。可是,上面的代码中并没有看到实例化book对象的语句。为什么?具体原因等到我们看完我们的配置文件之后再讨论。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <bean id="student" class="com.huai.first.Student"> <property name="book" ref="bookID"/> </bean> <bean id="bookID" class="com.huai.first.Book"/> </beans>
分析spring配置文件:
(1)、配置两个<bean>,目的是告诉spring容器,帮我实例化这两个类的对象,也就是student和book。
(2)、实例化两个对象之后,再帮忙把book对象作为Student类的一个属性传进去。对应的是:<property name="book" ref="bookID">(注:这里传进去的是book对象)
(ref表示:reference,引用的意思;其中name=“book”中的book需和Student类中的book属性名一样)
二、构造注入:
同样地,我们写两个类:
package com.huai.first; public class Book { public void doBookPrint(){ System.out.println("method -- doBookPrint"); } }
package com.huai.first; public class Student { private Book book; // public void setBook(Book book){ // this.book = book; // } public Student(Book book){ this.book = book; } public void doStudentPrint(){ this.book.doBookPrint(); } }注:Student类中增加了一个有参的构造方法;setBook方法可以保留的。
下面我们写一个main函数:(它和上面的设值注入的main函数相同)
<span style="font-size:14px;">package com.huai.first;</span><span style="font-size: 18px;"> </span><span style="font-size:14px;">import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student stu = context.getBean(Student.class); stu.doStudentPrint(); } }</span>
看看配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <bean id="student" class="com.huai.first.Student"> <!-- <property name="book" ref="bookID"/> --> <constructor-arg name="book" ref="bookID"/> </bean> <bean id="bookID" class="com.huai.first.Book"/> </beans>
请注意<constructor-arg>属性,name=“book”中的book是和Student类中的构造函数中的形参对应的。
分析:
设值注入:通过无参的构造方法来示例话,通过setter方法初始化属性。
构造注入:通过有参的构造函数实例化和初始化。
思考:似乎,使用spring框架比不使用更加麻烦了!我们这样使用spring-framework有必要吗?
回答:使用spring框架的目的不是本博文所涉及的内容,这里只是跟大家谈谈spring-framework的用法。谢谢
如果需要下载spring的jar包,请找上一篇博文最下面的链接
相关文章推荐
- javaWeb中解决中文乱码问题
- spring mvc使用@InitBinder 标签对表单数据绑定
- java 在窗口中如何定义一个文本框类型的数组
- Java:String和Date、Timestamp之间的转换
- 一起学spring--我的第一个Spring程序,简单粗暴易懂
- java.lang.ClassNotFoundException: org.hibernate.boot.model.naming.ImplicitNamingStrategy
- spring原理
- Java中用户向系统传递参数的三种基本方式
- java笔试勘误
- Java获取当前时间
- Java解决算三角形个数的问题
- Java中的static关键字解析
- Spring MVC 常用Jar包官方下载地址(官方Maven仓库)
- 大龄屌丝自学笔记--Java零基础到菜鸟--023
- java命令中-d32和-d64的含义
- java.util.random中nextFloat()取值问题
- java.net.SocketException: Address family not supported by protocol family: connect
- java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0
- eclipse项目发布路径
- Win7 eclipse Hadoop Failed to set permissions of path