学习Spring笔记三

上一篇的HelloWorld简单实现了用AC容器(也就是IOC容器)来创建UserDao类。IOC和DI说的是一回事,只不过一个从宏观上描述 ,一个从细节上描述。IOC是一种将组件依赖关系的创建和管理置于程序外部的技术。这使得一个类是很独立的,不需要承担更多的责任。

Spring创建对象是在我们把这个对象类已经建好,并且按照这个类的结构,在ApplicationContext.xml中安排好。然后通过配置文件反射创建这个类的对象,并且协调管理对象和对象之间的关系!!

IOC容器帮我们完成了两件事

1.对象的创建

2.对象关系的建立(DI依赖注入)

在IOC中对象的创建分三种创建方式,注入也有三种方式

IOC中对象的创建

1.无参构造方式创建对象,就像HelloWorld实例中一样,只是简单的通过beans.xml反射出对象

2.有参构造方式创建对象,意思是说这个对象是有参数的,那么在通过beans.xml反射的时候,还需要描述这个bean(对象)的参数,实例如下

实际的对象UserDao

public class UserDao{

private Integer abc;

private String ccc;

private boolean aa;

public UserDao(Integer abc,String ccc,boolean aa){
//这个bean对象的带参构造器

super();

this.abc = abc;

this.ccc = ccc;

this.aa = aa;

System.out.println("IOC容器创建有参数的UserDao时,我将被初始化");

}

public UsreDao(){
//这个bean对象的无参构造

System.out.println("IOC容器创建无参数的UserDao时,我会被初始化");

}

public void add(){

System.out.println("add.......");

}

}

beans.xml中做如下添加

<bean id="userDao"  class="com.bjsxt.dao.UserDao">

<constructor-arg index="0"  values="123" ></constructor-arg>   
//constructor-arg说明这个bean带参数,多个参数由index来区别是第几个

<constructor-arg index=“1”  values="xiaogao"></constructor-arg>     //values是具体注入的值

<constructor-arg index="2"  values="true"></constructor-arg>   
//第三个值是boolean型的

</bean>

写一个Test方法来测试一下有没有初始化有参构造器

public class Test{

public static void main(String[ ]  args){

ApplicationContext ac = new ClassPathXmlApplicationContext(

new String[]{ "beans.xml"}

);

UserDao dao = (UserDao)ac.getBean("userDao");

dao.add();

}

}

3.工厂方式创建对象,IOC容器中的工厂是在beans.xml中把daoFactory反射出来,再由daoFactory来创建对象,而不是由容器来创建对象,这是因为有些时候,别人已经写 好了daoFactory,你不便再修改(人家通过daoFactory创建了不少对象,你难道再一一通过IOC创建出来吗,肯定没必要),所以要直接把daoFactory反射出来,让它以前怎么创建还怎么创建。

工厂方式创建对象的实例

在beans.xml中重新定义一个bean,如下

<bean id="daoFactory"   class="com.bjsxt.dao.DaoFactory"></bean>      //把别人写好的daoFactory反射出来

<bean id="teacherDao"  factory-bean="daoFactory"  factory-method="newInstance"></bean>    //factory-bean写上面工厂bean的ID,说明这个bean是工厂new出来的,factory-method写daoFactory new出teacherDao后执行teacherDao中的哪个方法

别人写好的对象和工厂

public class TeacherDao{

public void add(){

System.out.println("teacher ..... add.....");

}

}

public class DaoFactory{

public TeacherDao newInstance(){

return new TeacherDao();

}

}

然后在Test.java中稍作改动

public class Test{

public static void main(String[ ] args ){

ApplicationContext ac = new ClassPathXmlApplicationContext(

new String[ ] {"beans.xml"}

);

TeacherDao dao = (TeacherDao) ac.getBean("teacherDao");  
//这里不需要得到配置文件里的daoFactory,那只是告诉IOC容器daoFactory和TeacherDao的关系

dao.add();

}

}

——————IOC容器帮我们创建对象的三种方式end——————————————

IOC容器对象关系的建立方式(也就是注入方式)

1.setter注入(最常见)

建立一个action包,下面建立一个UserAction.java

public class UserAction{

private UserDao userDao;

public UserDao getUserDao(){

return userDao;

}

public void setUserDao(UserDao userDao){

this.userDao = userDao;

}

public String add(){

userDao.add();
//这个userDao就是private UserDao userDao的那个,只要有set、get方法,这样就可以用了,不需要new,因为在beans.xml中已经分配好了userAction和userDao的关系,具体体现在这句:ref="userDao",struts2中也有这个功能。

return null;

}

}

UserDao.java

public class UserDao {

public void add(){

System.out.println("UserDao.add(add........)");

}

}

在beans.xml中加入两个bean(spring的配置文件叫ApplicationContext.xml最正宗,这里简写成beans.xml)

<bean id="userAction" class="com.bjsxt.action.UserAction">
//反射出userAction

<property name="userDao"
 ref="userDao"></property>
//这里是通过userDao找到userAction中的setUserDao(UserDao userDao)方法; 就是简单的set注入,默认调用set方法,在action中写上set方法就成了  。property就是userAction类中的参数的意思

</bean>

<bean id="userDao" class="com.bjsxt.dao.UserDao"></bean>
//这个bean一定别丢,不然找不到userDao的对象会报错

Test.java

public class Test {

public static void main(String[] args) {

ApplicationContext ac = new ClassPathXmlApplicationContext(

new String[]{"ApplicationContext.xml"}

);

UserAction userAction = (UserAction) ac.getBean("userAction");

userAction.add();

}

}

2.构造器注入(和set注入不同的是不用创建set、get方法了,改创建构造器了,然后beans.xml配置文件中再改改写法,就这么简单)

public class UserAction{

private UserDao userDao;

public UserAction(UserDao userDao){
//建了个有参构造

super();

this.userDao = userDao;

}

public String add(){

userDao.add();

return null;

}

}

在beans.xml中添加两个bean

<bean id="userAction"  class="com.bjsxt.action.UserAction">

<constructor-arg index="0" ref="userDao"></constructor-arg>

</bean>

<bean id="userDao" ref="com.bjsxt.dao.UserDao"></bean>

Test.java中写

public class Test{

public static void main(String[ ]  args){

ApplicationContext  ac = new ClassPathXmlApplicationContext(

new String[ ] {"beans.xml"}

);

UserAction userAction = (UserAction)ac.getBean("userAction");

userAction.add();

}

}

重要提示:Spring环境下,服务类千万不要自己new,要从容器当中拿!!!!因为容器中的对象不单单是对象,还包含和其它对象的关系。Spring约束编程,改变一种编程习惯。

3.接口注入(了解)

Spring中的beans.xml也可以叫ApplicationContext.xml,这个是最规范的叫法,叫这名字,配置文件图标会变成小树叶。

———————————对象关系的建立(注入的建立)end———————————————————————

时间: 2024-08-13 00:53:10

学习Spring笔记三的相关文章

spring笔记(三)

Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的"事务控制", 可以用aop实现! 即只需要写一次,运行时候动态织入到业务方法上. Spring提供了对事务的管理,开发者只需要按照Spring的方式去做就行. 目标: 1. Spring声明式事务管理 * XML配置 *注解方式 2. Spring与Hibernate整合 3.  SSH整合 1. 程序中事务控制 1.1 环境准备 用户访问->

深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同样的方差,降低相邻像素的相关性. 主成分分析PCA PCA算法可以将输入向量转换为一个维数低很多的近似向量.我们在这里首先用2D的数据进行试验,其数据集可以在UFLDL网站的相应页面http://ufldl.stanford.edu/wiki/index.php/Exercise:PCA_in_2D

Spring笔记(三)AOP前篇之动态代理

AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合.比较强调程序的层次结构,是一种面向切面的编程.而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态代理,两者的区别是JDK动态代理的实现中业务类必须必须定义接口,而CGLIB没有这个约束,可以说CGLIB更强大: JDK动态代理实现示例: // 业务接口定义 public interface IUnit {     void execute(String msg); } // 业务实现类 pub

Spring Batch学习笔记三:JobRepository

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用HSQLDB,也就是说在Job的运行过程中,所有的元数据都被储存在内存中,在Job结束后会随着进程的结束自动消失:在这里我们推荐配置JobRepository去使用MySQL. 在这种情况下,Spring Batch在单次执行或者从一个执行到另外一个执行的时候会使用数据库去维护状态,Job执行的信息包

Spring Boot学习进阶笔记(一)-初体验,创建基本的web功能

什么是spring boot?,使用spring boot有什么好处?这些东西不过多陈述,自行百度,在这作为只是以一个开发者的角度,记录下自己学习spring boot的过程,作为一种学习笔记跟大家分享,如果有什么不严谨或者错误的地方,请大家留言指出. 一.初始化项目结构 通过官方网站(http://start.spring.io/)生成基本的maven结构的项目框架,如下图!点击按钮"Generation Project"后生成基本的目录,然后导入到eclipse,就可以进行代码的编

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

NFC学习笔记——三(在windows操作系统上安装libnfc)

本篇翻译文章: 这篇文章主要是说明如何在windows操作系统上安装.配置和使用libnfc. 一.基本信息 1.操作系统: Windows Vista Home Premium SP 2 2.硬件信息: System: Dell Inspiron 1720 Processor: Intel Core 2 Duo CPU T9300 @ 2.5GHz 2.5GHz System type: 32-bit Operating System 3.所需软件: 在windows操作系统上安装软件需要下列

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会