java 学习之Spring(一)

Spring学习(一)

学习方式:blog+imooc
Spring是一个开源框架,其核心是控制反转(IOC)和面向切面(AOP)

  • IOC:即控制反转。对于Spring来说,Spring创建对象的过程,不是程序员new一个对象实现的,而是交给Spring来进行配置实现的;
  • AOP:面向切面
    Spring的IOC的底层实现原理
    原理是工厂设计模式+反射+XML配置文件
    1.首先在一个XML文件里面配置标签
<?xml version="1.0" encoding="UTF-8"?>
<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入门的配置 -->
	<bean id="userDao" class="com.meimeixia.spring.demo01.UserDaoImpl"></bean>
	
</beans>

2.利用spring来创建对象

package com.meimeixia.spring.demo01;

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

/**
 * Spring的入门
 * @author liayun
 *
 */
public class SpringDemo01 {
	
	/*
	 * 传统方式的调用
	 */
	@Test
	public void demo01() {
		UserDao userDao = new UserDaoImpl();
		userDao.save();
	}
	
	/*
	 * Spring的方式的调用
	 */
	@Test
	public void demo02() {
		//先要创建Spring的工厂
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// classpath就是类路径,src目录下的文件最终要编译到类路径下
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
		userDao.save();
	}
}

下面来讲讲DI,即依赖注入
相信直接上代码就能懂

<?xml version="1.0" encoding="UTF-8"?>
<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入门的配置 -->
	<bean id="userDao" class="com.meimeixia.spring.demo01.UserDaoImpl">
		<!-- DI:依赖注入 -->
		<property name="name" value="李二" />
	</bean>
	
</beans>

name为类的一个属性,只要在XML文件配置了这个属性,使用工厂创建对象的时候就不需要自己手动赋值了

Bean的相关配置

标签中id和name属性的配置

  • id属性:在Spring配置文件中会有多个bean标签,但它们的id属性值是不能相同的。Bean起名字时,在约束中采用的是ID约束(唯一约束),而且名字必须以字母开始,可以使用字母、数字、连字符、下划线、句号、冒号等,但id属性值绝对不能有特殊符号;
  • name属性:没有使用约束中的唯一约束,理论上name属性值是可以出现重复的,但是这在实际开发中是不可能出现的,而且它里面可以出现特殊字符。其实,在Spring和Struts1框架进行整合的时候,才有可能会用到

的生命周期的配置
通过配置标签上的init-method作为Bean被初始化的时候执行的方法,配置destroy-method作为Bean被销毁的时候执行的方法,要想Bean被销毁的时候执行destroy-method属性中配置的方法,那么Bean得是单例创建的(默认即单例创建),而且只有工厂被关闭时,destroy-method属性中配置的方法才能被执行。
到底怎么用呢,下面有个例子
首先,在src目录下创建一个com.meimeixia.spring.demo02包,并在该包下创建一个名为CustomerDao的接口。

package com.meimeixia.spring.demo02;

public interface CustomerDao {
	
	public void save();

}

然后,在com.meimeixia.spring.demo02包下创建CustomerDao接口的一个实现类——CustomerDaoImpl.java。

package com.meimeixia.spring.demo02;

public class CustomerDaoImpl implements CustomerDao {
	
	public void setup() {
		System.out.println("CustomerDaoImpl被初始化了......");
	}

	@Override
	public void save() {
		System.out.println("CustomerDaoImpl中的save方法执行了......");	
	}
	
	/*
	 * 工厂被关闭之后,才会调用该方法
	 */
	public void destroy() {
		System.out.println("CustomerDaoImpl被销毁了......");
	}

}

接着,将CustomerDaoImpl实现类交给Spring来管理,即在配置文件中配置对象的创建。

<?xml version="1.0" encoding="UTF-8"?>
<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入门的配置 -->
	<bean id="userDao" class="com.meimeixia.spring.demo01.UserDaoImpl">
		<!-- DI:依赖注入 -->
		<property name="name" value="李二" />
	</bean>
	
	<!-- Spring的bean的生命周期的配置 -->
	<bean id="customerDao" class="com.meimeixia.spring.demo02.CustomerDaoImpl" init-method="setup" destroy-method="destroy" />
	
</beans>

的作用范围的配置
Bean标签有一个scope属性,他代表Bean的作用范围,有五个属性值

下面我们来看看Spring中Bean的实例化方式

Spring创建Bean有三种方式,分别是

  • 无参构造方法的方式
  • 静态工厂实例化的方式
  • 实例工厂实例化的方式

无参构造方法的方式(默认)
这种方式是Spring实例化Bean的默认方式,指的是在创建对象的时候,Spring会调用类里面的无参数的构造方法实现。这里,我会通过一个案例来讲讲这种方式。首先,在src目录下创建一个com.meimeixia.spring.demo03包,并在该包下创建一个名为Bean1的类。

package com.meimeixia.spring.demo03;

/**
 * 无参构造方法的方式(默认)
 * @author liayun
 *
 */
public class Bean1 {
	
	public Bean1() {
		System.out.println("Bean1的无参数的构造方法执行了......");
	}
	
}

然后,将以上类交给Spring来管理,所以Spring配置文件就该下面这样写了。
在这里插入图片描述
接着,在com.meimeixia.spring.demo03包下创建一个SpringDemo03的单元测试类。

package com.meimeixia.spring.demo03;

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

public class SpringDemo03 {

	/*
	 * 无参构造方法的方式(默认)
	 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}

最后,运行以上demo01单元测试方法,你就会发现Eclipse控制台打印了如下内容。
java 学习之Spring(一)_第1张图片

静态工厂实例化的方式
创建一个工厂类,在工厂类中提供一个静态的方法,这个方法返回类的对象,调用工厂类的方法的时候,直接使用类名.方法名称即可以调用。这里,我会通过一个案例来讲讲这种方式。首先,在com.meimeixia.spring.demo03包下创建一个名为Bean2的类。

package com.meimeixia.spring.demo03;

public class Bean2 {
	
	public Bean2() {
		System.out.println("Bean2类中的无参构造方法执行了......");
	}
	
}

然后,在该包下创建一个Bean2Factory工厂类。

package com.meimeixia.spring.demo03;

/*
 * Bean2的静态工厂
 */
public class Bean2Factory {

	public static Bean2 createBean2() {
		System.out.println("Bean2Factory中的方法执行了......");
		return new Bean2();
	}

}
接着,将以上工厂类交给Spring来管理,所以Spring配置文件就该写成下面这样。

紧接着,在SpringDemo03的单元测试类中编写如下的一个demo02测试方法。

package com.meimeixia.spring.demo03;

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

public class SpringDemo03 {

	/*
	 * 无参构造方法的方式(默认)
	 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}
	
	/*
	 * 静态工厂实例化的方式
	 */
	@Test
	public void demo02() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
		System.out.println(bean2);
	}
	
}

最后,运行以上demo02单元测试方法,你就会发现Eclipse控制台打印了如下内容。

实例工厂实例化的方式
创建一个工厂类,在工厂类里面提供一个普通的方法,这个方法返回类对象,调用工厂类的方法时,创建工厂类对象,使用对象调用方法即可。这里,我也会通过一个案例来讲讲这种方式。首先,在com.meimeixia.spring.demo03包下创建一个名为Bean3的类。

package com.meimeixia.spring.demo03;

public class Bean3 {
	
	public Bean3() {
		System.out.println("Bean3类中的无参构造方法执行了......");
	}
	
}

然后,在该包下创建一个Bean3Factory工厂类。

package com.meimeixia.spring.demo03;

/**
 * Bean3的实例工厂
 * @author liayun
 *
 */
public class Bean3Factory {

	public Bean3 createBean3() {
		System.out.println("Bean3的实例工厂中的方法执行了......");
		return new Bean3();
	}
	
}

接着,将以上工厂类交给Spring来管理,所以Spring配置文件就该写成下面这样。

紧接着,在SpringDemo03的单元测试类中编写如下的一个demo03测试方法。

package com.meimeixia.spring.demo03;

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

public class SpringDemo03 {

	/*
	 * 无参构造方法的方式(默认)
	 */
	@Test
	public void demo01() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}
	
	/*
	 * 静态工厂实例化的方式
	 */
	@Test
	public void demo02() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
		System.out.println(bean2);
	}
	
	/*
	 * 实例工厂实例化的方式
	 */
	@Test
	public void demo03() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
		System.out.println(bean3);
	}
	
}

最后,运行以上demo03单元测试方法,你就会发现Eclipse控制台打印了如下内容。
java 学习之Spring(一)_第2张图片

Spring中属性注入

这部分内容我推荐是到另一篇博客里看,链接在本文末尾的声明中

只为在学习中做学习笔记

声明:本文部分内容摘取自https://blog.csdn.net/yerenyuan_pku/article/details/100179932这篇优秀博文,最后一部分属性注入,在这篇博文中讲的什么到位

你可能感兴趣的:(java 学习之Spring(一))