SpringDay01

Spring是一个分层的一站式轻量级开源框架,它的核心是IOC(控制反转)以及AOP,面向切面编程;javaEE开发的三个阶段:web层(JSP,Struts2),业务层(Javabean)以及持久层(Dao,Hibernate)。

为什么要学习Spring?Spring是一个大的工厂,同样可以把它理解成为一个大的对象容器,它的里面可以存放许多的对象,这些对象可以包含各种功能,它的最强大之处就是可以实现和其他优秀框架的整合;

关于IOC和DI:

IOC:控制反转,所谓的控制反转就是创建对象的方式不同而已,以前写一个程序,创建对象都是由我们的开发人员来完成,包括依赖的注入也是我们自己去完成,使用了Spring之后,对象的创建和依赖都由Spring独自完成。

DI:依赖注入,实现IOC需要DI的支持

注入的方式分为:set方法注入,构造方法注入,字段注入

注入类型:值类型,引用类型
    首先我们创建一个比较简单的Spring入门项目:IDE使用eclipse

下载Spring的开发包:http://repo.springsource.org/libs-release-local/org/springframework/spring

第一步:创建一个web项目,命名为SpringDay01;

第二步:导入jar包(开发包中解压获取);

第三步:创建一个简单的实体User类

public class User {
	private String name;
	private Integer age;
	public User(String name,Integer age) {
		this.age = age;
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

导入约束:第一步:从功能栏中选择window —>preferences

之后在src目录下创建一个ApplicationContext.xml文件,输入<beans></beans>,点击下方的design;右键 Edit Namespaces;先直接添加一个xsi,之后再add newNameSpace,下第三行选框中选择自己刚才导入的约束,第二行上面将不带名称的约束进行复制粘贴进行即可;

约束导入成功显示如下图:

接下来我们需要书写xml中的配置,如下图:

书写测试类检测Spring是否创建了User对象:

控制台打印输出为:

关于BeanFactory&ApplicationContext

BeanFactory是最原始的接口,针对原始接口的功能比较单一;

BeanFactory接口实现类的容器,每次getBean时才会去创建对象

ApplicationContext:算是后来从BeanFactory发展的一个接口,它的特点是每次容器启动时就会创建所有的对象,并且提供更多的功能;关于ApplicationContext有两种形式,一种是通过从类路径下加载配置文件ClassPathXmlApplicationContext(“默认是src下的xml文件”),另一种是通过硬盘的绝对位置加载配置文件FileSystemXmlApplicationContext(“文件存放的绝对位置”)

二者相比之后的结论:在web开发的过程中使用ApplicationContext,在资源环境比较缺乏的时候使用BeanFactory。

关于Bean元素的配置:

<bean name="user" class="com.bean.User"></bean>

Class属性中是被管理对象完整类名,name属性是给被管理的对象起一个名字,获取对象时根据该名称进行获取;name属性可以重复,可以含有特殊字符。

Spring中三种对象创建方式:

第一种空参构造(默认):

public class User {

    private String name;

    private int age;

    public User() {

       System.out.println("空的构造方法创建对象!");

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public int getAge() {

       return age;

    }

    public void setAge(int age) {

       this.age = age;

    }

}

 第二种,静态工厂创建:

通过静态方法去创建对象,可以直接用类名直接去调用该静态方法。

public class UserFactory {

       public static User createFactory() {

              System.out.println("静态工厂的方式创建对象!");

              return new User();

       }

}

Bean中配置如下:

利用UserFactoy中的createFactory来创建名为user02的对象;

第三种:利用实例工厂创建

所谓的利用实例工厂方式,就是在类中所调用的某一个用来创建对象的那个方法不是静态的,不能够再像静态工厂那样利用类名进行调用啦,而是通过实例工厂对象来创建我们需要去管理的对象,具体实现如下:

public class UserFactory {

       public User createFactory02() {

              System.out.println("实例工厂的方式创建对象!");

              return new User();

       }

}

Bean中的配置如下:

关于scope属性:

scope="singleton"(默认值)单例对象,被标识为单例的对象在Spring容器中只会存在一个实例;一般情况下都是使用单例对象,但是在于Struct2整合的时候,ActionBean必须配置为多例的,即为prototype值

scope="prototype"多例原型,被标识为多例对象,每次再获得才会创建,每次创建都是新的对象。

初始化以及销毁方法:

init-method="init" :初始化方法,Spring会在对象创建之后调用它

public void init() {

              System.out.println("我是初始化方法!");

       }

destroy-method="destory":销毁方法,Spring容器在关闭并且销毁所有容器中的对象之前调用它。

public void destory() {

              System.out.println("我是销毁方法!");

       }

关于模块化配置:

关于属性注入:

值类型注入:值类型注入就是单纯的为某一个属性进行值的设置,如:

引用类型注入:利用引用的方式注入

总结:值类型注入使用value属性,引用类型注入使用ref属性,传入的是一个对象;

关于构造函数注入:

Name、value以及ref属性和之前学些的一样,就是多了index以及type属性;对于index属性可以对于public User(String name,Car car)和public User(Car car,String name)构造方法,由于参数位置不同,我们可以通过index来决定哪一个在前,哪一个在后面;对于type属性,是关于public User(String name,Car car)以及public User(Integer name,Car car)类型不同所引发的问题;这几个属性的使用,可以精确地定位到某一个构造函数,可以实现更好的注入;

P空间注入:实质上还是利用了set注入;

后面的bean标签中依赖注入可以写为:

SPEL注入:Spring 表达式语言

注意在对象注入的过程中是不能够利用Spring表达式语言进行书写的;

关于复杂类型注入:

package com.bean;

import java.util.Arrays;

import java.util.Collection;

import java.util.List;

import java.util.Map;

import java.util.Properties;

public class CollectionBean {

       private Object[] arr;//数组类型注入

       private Map map;//map类型注入

       private List list;//list类型注入

       private Properties prop;

       public Object[] getArr() {

              return arr;

       }

       public void setArr(Object[] arr) {

              this.arr = arr;

       }

       public Map getMap() {

              return map;

       }

       public void setMap(Map map) {

              this.map = map;

       }

       public List getList() {

              return list;

       }

       public void setList(List list) {

              this.list = list;

       }

       public Properties getProp() {

              return prop;

       }

       public void setProp(Properties prop) {

              this.prop = prop;

       }

       @Override

       public String toString() {

              return "CollectionBean [arr=" + Arrays.toString(arr) + ", map=" + map + ", list=" + list + ", prop=" + prop

                            + "]";

       }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值