学习方式:blog+imooc
Spring是一个开源框架,其核心是控制反转(IOC)和面向切面(AOP)
<?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文件配置了这个属性,使用工厂创建对象的时候就不需要自己手动赋值了
标签中id和name属性的配置
的生命周期的配置
通过配置标签上的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会调用类里面的无参数的构造方法实现。这里,我会通过一个案例来讲讲这种方式。首先,在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控制台打印了如下内容。
静态工厂实例化的方式
创建一个工厂类,在工厂类中提供一个静态的方法,这个方法返回类的对象,调用工厂类的方法的时候,直接使用类名.方法名称即可以调用。这里,我会通过一个案例来讲讲这种方式。首先,在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控制台打印了如下内容。
属性注入这部分内容我推荐是到另一篇博客里看,链接在本文末尾的声明中
只为在学习中做学习笔记
声明:本文部分内容摘取自https://blog.csdn.net/yerenyuan_pku/article/details/100179932这篇优秀博文,最后一部分属性注入,在这篇博文中讲的什么到位