Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

使用Spring框架必须要使用jar包

spring xml 里面 if else_xml


可以在jar官网下载https://repo.spring.io/libs-release-local/org/springframework/spring/

下载对应的jar包 4.3.10.RELEASE/

版本号说明:
例如版本号:3.1.2RELEASE
3:主版本号。当功能模块有较大更新或者整体架构发生变化时,主版本号会更新
1:次版本号。次版本表示只是局部的一些变动。
2:修改版本号。一般是 bug 的修复或者是小的变动
RELEASE:希腊字母版本号。次版本号用户标注当前版本的软件处于哪个开发阶段

Spring的使用XML配置方式以及Spring的使用

首先创建java项目

spring xml 里面 if else_User_02


/**
 * 非IOC方法获取user对象
 */
 @Test
 public void test1() {
 User user=new User();
 System.out.println(user);
 }

xml配置

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd">

spring xml 里面 if else_Test_03


会取得上述连接

在applictionContext.xml中添加如下代码

<!-- 注册User对象-->
  <bean class="com.sxt.pojo.User"  name="username1"  id="userid"/>

效果图:

spring xml 里面 if else_xml_04

创建User类

public User(){
		System.out.println("访问了无参构造");
	}
	public void run(){
		
		System.out.println("执行了User类的run方法");
	}

创建iocTest类

/**
	 * 非IOC方法获取user对象
	 */
	@Test
	public void test1() {
		User user=new User();
		System.out.println(user);
	}

测试类test1

spring xml 里面 if else_Test_05

在iocTest中创建test2方法利用id查询

/**
	 * 使用IOC方法获得user对象
	 * 无参构造必须有否则会报错
	 * 通过id查询获取user对象
	 */
	@Test
	public void test2(){
		//加载Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		//从Spring中获得user对象
		User user=(User)ac.getBean("userid");
		user.run();
	}

执行测试test2方法

spring xml 里面 if else_User_06


注意:无参构造方法必须有否则会报错

通过name访问user

/**
	 * 通过name获取user
	 */
	@Test
	public void test3(){
		//加载Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		//从Spring中获得user对象
		User user=(User) ac.getBean("username1");
		user.run();
	}

测试test3:

spring xml 里面 if else_Test_07


测试多个name属性

在name中添加及格name属性

<bean class="com.sxt.pojo.User"  name="username1,username2,userneme3"
  id="userid"/>

创建test4:

/**
	 * 多个name属性测试一
	 */
	@Test
	public void test4(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		User user=(User) ac.getBean("username1");
		user.run();
	}

测试test4方法

spring xml 里面 if else_Test_08

创建test5

/**
	 * 多个name属性测试二
	 */
	@Test
	public void test5(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		User user=(User) ac.getBean("username2");
		user.run();
	}

测试test5类:

spring xml 里面 if else_Test_09


上述两个类都可以通过测试证明name可以有多个:

下面开测试id值是否可以有多个

单个id在上面已经测试过了这里就直接测试多个id:
在applictionContext.xml中添加id属性
这里我创建了多个User对象我就直接复制了:

<bean class="com.sxt.pojo.User"  name="username3,username4"  
 id="userid1,userid2"/>

创建test7方法

/**
	 * 多个id测试一
	 */
	@Test
	public void test7(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		User user =(User) ac.getBean("userid1");
		user.run();
	}

测试test7方法:

spring xml 里面 if else_xml_10


上述方法执行了无参构造没有执行run方法说明id值只能是唯一的,不能同时存在多个

在将值谢完整后就能后测试成功:

/**
	 * 多个id测试二
	 */
	@Test
	public void test7(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		User user =(User) ac.getBean("userid1,userid2");
		user.run();
	}

测试test7方法:

spring xml 里面 if else_User_11


可以执行run方法id值,综上得出id值只能够有一个,而name可以有多个;

测试工厂模式(静态,动态工厂)

创建UserFactory类:

/**
	 *动态工厂
	 * 工厂方法,new一个User
	 * @return
	 */
	public  User getInstance(){
		return new User();
		
	}

在applictionContext.xml中配置动态工厂
注意:前面配置的要 注释 或 删除 掉否则会报错

<!-- 动态工厂 -->
  <bean class="com.sxt.factory.UserFactory" id="userFactory"/>
 <bean factory-bean="userFactory" factory-method="getInstance" id="userid"/>

我这里直接用了test2作为实现方法:

@Test
	public void test2(){
		//加载Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		//从Spring中获得user对象
		User user=(User)ac.getBean("userid");
		user.run();
	}

测试test2:

spring xml 里面 if else_xml_12


可以执行run方法证明动态工厂配置成功

上面遗漏了一个方法没有没有解决就是同时出现注册两个user对象时怎么解决
将applictionContext.xml添加一条注册user
如下图

<!-- 注册User对象-->
 <bean class="com.sxt.pojo.User"  name="username1,username2,userneme3"  id="userid"/>
 <bean class="com.sxt.pojo.User"  name="username3,username4"  id="userid1"/>

测试test6类

@Test
	public void test6(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		User user =(User) ac.getBean("userid1");
		user.run();
	}

会出现如下结果:

spring xml 里面 if else_User_13


只访问了无参构造没有执行run方法:

我们可以在id值userid后加上 User(类名).class可以解决

如下图:

@Test
	public void test6(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applictionContext.xml");
		User user =(User) ac.getBean("userid1",User.class);
		user.run();
	}

测试test类

spring xml 里面 if else_xml_14


访问到了id为:userid1的的run方法成功,出现这个问题是回因为id值没有被找到,指明要找的id值就可以了。