Spring复习(一)

1.Spring一站式框架

①正是因为Spring框架性质是属于容器性质的。

②容器中装什么对象就有什么功能,所以可以一站式

③不仅不排斥其他框架,还能帮其他对象管理对象

④aop支持

⑤ioc思想

⑥spring jdbc

⑦aop事务

⑧junit测支持

2.Spring初体验:

Spring中最核心的四个包

3.关于spring的相关属性

①id和name属性

id :Bean 起个名字. 在约束中采用 ID 的约束:唯一.必须以字母开始,可以使用字母、数字、连字符、 下划线、句话、冒号 id:不能出现特殊字符.

name:Bean 起个名字. 没有采用 ID 的约束. name:出现特殊字符.如果没有 id 的话 , name 以当做 id 使用.

②scope 属性:Bean 的作用范围

 singleton :默认值,单例的.

 prototype :多例的

request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.

session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.

globalSession :WEB 项目中,应用在 Porlet 环境.如果没有 Porlet 环境那么 globalSession 相当

session.

4.Bean 的生命周期的配置:

通过配置标签上的 init-method 作为 Bean 的初始化的时候执行的方法,配置 destroy-method 作为 Bean 的销毁的时候执行的方法销毁方法想要执行,需要是单例创建的 Bean 而且在工厂关闭的时候,Bean 才会被销毁.

5.Spring Bean 的管理 XML 的方式

① Spring 生成 Bean 的时候三种方式

无参数的构造方法的方式:

<bean id="bean1" class="cn.itcast.spring.demo3.Bean1">bean>

6.spring的一些野史

我这边分享一个spring整合的jar包,有需要的朋友可以下载下来用

链接:https://pan.baidu.com/s/1GHbu5q-tw8RQ8-hHtppVrw 
提取码:x71x 

spring的强大之处就是它将市场常用到的jar包都收集过来了并且做了一个整合,通用版4.2.4版

下面是解压之后的情况

 
单独说一下约束文件,以下是spring中常用的几个约束文件

下来就是spring中最基础用到的几个jar包:

 

还要导的一个常用的日志包

7.在Eclipse中导入Spring的约束文件

前提准备工作:

Window--》Preferences--》输入cata--》点击XML Catalog--》Add

准备添加第一个约束文件及spring-beans-4.2.xsd(从刚解压的那个spring整合包中找到约束文件里面添加即可)

导入一个spring-beans-4.2.xsd约束文件是这样,导入其他的也一样。。。

①首先它应该是在src底下,如果不知道以什么命名,就用applicationContext.xml这个吧

②进行配置

增加一个根元素(注意字母大小写)

③转换到设计模式

先Design--》Edit Namespaces

 然后进去之后点Add--》钩xsi--》ok

出来之后应该是这样的,再继续Add 

 

 我这个beans-4.2是我之前添加好的,所以现在可以直接找到

 

 这两部分保持一致

出现下面的这些就说明导入成功了

 然后就变成这个样子了

再然后如果要测试是否成功,就是在beans标签底下按Alt+/如果有提示就说明成功了

8.新建一个User对象

9.把新建的对象配置到Spring的配置文件中

 拿到对象的完整类名,然后配置到spring的bean中的class中

 

再继续name属性给它起个名字,为了以后取得时候好取,后面需要的时候可以直接根据名字取

10.测试在spring中已经配置好的对象

附上代码:

package com.yinxin.hello;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yinxin.bean.User;

public class JunitDemo {
	@Test
	public void fun1(){
		
		//创建容器对象
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//从类路径下加载spring的xml配置文件
		//向容器要“User”对象
		User user = (User) ac.getBean("user");
		//打印User对象
		System.out.println(user);
		
	}

}

11.spring的概念性问题:

IOC:Inverse of Control 反转控制

    ①将我们创建对象的方式反转了

    ②以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入

    ③使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入。

    ④反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序(spring)。

DI:Dependency Injection 依赖注入,需要有IOC的环境,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去。

    ①实现IOC思想需要  DI做支持

    ②注入方式:

           set方法注入

          构造方法注入

          字段注入

    ③注入类型

          值类型注入

          引用类型注入

关于ApplicationContext&BeanFactory

BeanFactor接口:

             spring原始接口,针对原始接口的实现类功能较为单一

             BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象

ApplicationContext接口:

              每次容器启动时就会创建容器中配置的所有对象,并提供更多功能

             从类路径下加载配置文件:ClassPathXmlApplicationContext

             从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext("D://xxxx//yyyy/xxxx")

 总结: Web开发中,使用applicationapplicationContext,在资源匮乏的环境可以使用BeanFactory

12.Spring创建对象的方式:

①空参构造方式

②静态工厂(了解)

③实例化工厂(了解)   

代码如下:

总体目录结构:

实体类:

package com.yinxin.bean;
/**
  *实体
  */
public class User {
  private String name; 
  private Integer age;
public User() {
	System.out.println("空参构造方法!");
}
public User(String name, Integer age) {
	super();
	this.name = name;
	this.age = age;
}
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;
}


   

}

工厂类:

package com.yinxin.create;

import com.yinxin.bean.User;

/**
 * @content 工厂类
 * @author syp
 * @time 2019年6月25日09:59:54
 */

public class UserFactory {
 
	public static User createUser(){
		System.out.println("静态工厂创建User"); 	
		return new User();
	}
	
	public User createUser2(){
		System.out.println("实例工厂创建User");
		return new User();
	}
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 将User对象交给spring容器管理 ,即class:放置完整类名,name:给它起个名字	-->
<!-- 创建方式1:空参构造创建 -->
<bean name="user" class="com.yinxin.bean.User"></bean>
<!-- 创建方式2:静态工厂创建 
  调用UserFactory的createUser方法创建名为user2的对象,放进容器
 -->
 <bean name="user2" class="com.yinxin.create.UserFactory" factory-method="createUser"></bean> 
 <!-- 创建方式3:实例工厂创建 
  调用UserFactory对象的createUser2方法创建名为user3的对象,放入容器
 -->
 <bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean> 
 <bean name="userFactory" class="com.yinxin.create.UserFactory" ></bean> 
</beans>

测试类:

package com.yinxin.hello;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yinxin.bean.User;
/**
 * @content 测试类
 * @author syp
 * @time 2019年6月25日11:09:26
 */

public class JunitDemo {
	//创建方式1:空参构造方法
	@Test
	public void fun1(){
		//创建容器对象
		ApplicationContext ac=new ClassPathXmlApplicationContext("com/yinxin/create/applicationContext.xml");//从类路径下加载spring的xml配置文件
		//向容器要“User”对象
		User u = (User) ac.getBean("user");
		//打印User对象
		System.out.println(u);
		
	}
	//创建方式2:静态工厂
	@Test
	public void fun2(){
		//创建容器对象
		ApplicationContext ac=new ClassPathXmlApplicationContext("com/yinxin/create/applicationContext.xml");//从类路径下加载spring的xml配置文件
		//向容器要“User”对象
		User u = (User) ac.getBean("user2");
		//打印User对象
		System.out.println(u);
	}
	//创建方式2:实例工厂
	@Test
	public void fun3(){
		
		//创建容器对象
		ApplicationContext ac=new ClassPathXmlApplicationContext("com/yinxin/create/applicationContext.xml");//从类路径下加载spring的xml配置文件
		//向容器要“User”对象
		User u = (User) ac.getBean("user3");
		//打印User对象
		System.out.println(u);
	}


}

测试类运行结果:

 13.关于Spring中Bean元素进阶的scope属性

①singleton(默认值):单例对象.被标识为单例对象在spring容器中只会存在一个对象

 创建多个对象后看下测试结果:

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

及用法和上面的单例对象正好相反,它所创建的多个对象都是新的,即它们都指向不同的地址

设立多例对象后运行的效果:

③request(了解):Web环境下,对象与request生命周期一致

④session(了解):Web环境下,对象与session生命周期一致

总结:

        当Struts2和Spring整合的时候,action要交给Spring来管理,这样的话Struts2每次调用action或者访问action的时候都会找Spring要,这个时候切记,action要配置成多例模式,因为action在Struts2从架构上来说 ,是每次请求都会创建一个新的action,所以action的这个bean在使用的时候必须设置为多例的。如果为单例的就完了,假如同时有10个请求过来,Struts2找Spring要action,结果Spring给了10个请求统一的action,这样就改变了struts2的设计了,那么问题就多了 。

14.关于Spring中Bean元素进阶的生命周期

①配置一个方法作为生命周期初始化方法,Spring会在对象创建之后立即调用。

 init-method

②配置一个方法作为生命周期的销毁方法,Spring容器在关闭并销毁容器中的对象之前调用。

 destory-method

图示:

配置文件:

实体类中加:

在测试类中加:

 测试运行结果:

 15.关于Spring的分模块配置

在一个主配置文件中引入其他配置文件

16.Spring的Bean的属性注入:

①set方法注入

 测试类运行效果:

 测试类运行结果:

②构造函数注入

 

测试类运行结果:

③P名称空间注入(了解)

④spel注入(了解)

注:引用类型是不能用Spel表达式的;

⑤复杂类型注入

实体类:

package com.yinxin.inject;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class CollectionBean {
	private Object[] obj;  //数组类型注入
	private List list;   //list类型注入
	private Map map;    //map类型注入
    private Properties prop; //配置文件类型注入
	public CollectionBean() {
		super();
		// TODO Auto-generated constructor stub
	}
	public CollectionBean(Object[] obj, List list, Map map, Properties prop) {
		super();
		this.obj = obj;
		this.list = list;
		this.map = map;
		this.prop = prop;
	}
	public Object[] getObj() {
		return obj;
	}
	public void setObj(Object[] obj) {
		this.obj = obj;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public Properties getProp() {
		return prop;
	}
	public void setProp(Properties prop) {
		this.prop = prop;
	}
	@Override
	public String toString() {
		return "CollectionBean [obj=" + Arrays.toString(obj) + ", list=" + list + ", map=" + map + ", prop=" + prop
				+ "]";
	}
    
    
}

配置文件 

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉梦洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值