IOC: 控制反转
思想大白话: 把创建对象的权利交给spring了
底层技术支持: 工厂+反射+配置文件 (spring都封装好了)
解决的问题: 解耦合
spring的环境搭建:
1 导包:
beans core context expression
spring在运行的过程中 会加载一个日志包
commons-logging.jar 提供了日志功能 但是企业不用它记录日志
apache--log4j.jar 企业开发用的最多的是它记录日志
log4j.properties
spring在加载的过程中会加载commons-logging.jar日志包
commons-logging.jar日志包的内部会看有没有apache--log4j.jar包
如果有 就是用commons-log4j.jar功能来记录日志
如果没有 就使用自己的
2 创建一个类
package com.it.bean;
public class User {
// 构造器
public User()
{
System.out.println("我被创建了...");
}
public void run()
{
System.out.println("跑~~~~~");
}
// 指定一个方法为初始化方法
public void init()
{
System.out.println("我要初始化了...");
}
// 指定一个方法为销毁方法
public void destory()
{
System.out.println("我挂了..66666666");
}
}
3 在src下面有一个配置文件 建议用: applicationContext.xml
所有约束都抽出来放在一个html文件中
/spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html
4 测试
//自己new对象
@Test
public void t1() {
User user=new User();
user.run();
}
//spring ioc 来创建对象
@Test
public void t2() {
// 加载配置文件,ClassPathXmlApplicationContext("xml配置文件的名字")
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//向spring要对象,getBean("xml配置文件bean标签里面的id的值")
User user = (User) context.getBean("user");
user.run();
}
<?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">
<!--
1: 基本配置
bean标签: 指定要创建的实体类
id属性: 可以为任意值 但是在整个配置文件中唯一
class属性: 要实例化类的全限定名 反射
-->
<bean id="user" class="com.it.bean.User"></bean>
二: ioc的配置文件内容
bean标签: 指定要实例化的对象
id属性: 唯一标识 可以为任意值 但是整个xml唯一
class属性: 类的全限定名 就是通过它反射该类的实例对象
scope属性: 范围
重点:
singleton: 单实例 默认值
配置文件只要一加载 就会创建该实例对象 放在spring容器中 (Map<user,实例对象>)
注意:只创建一次
当每个人过来要的时候(getBean("user")) 从spring容器中获取的都是同一个实例对象
2: scope属性: 范围
singleton: 单实例 默认值
如果是单实例,配置文件文件只要一加载 就会创建对象 放在spring容器 (map<id,对象>)
当所有人过来问spring容器要的时候(getBean),所用人用的都是同一个对象
<bean id="user" class="com.it.bean.User" scope="singleton"></bean>
//测试bean标签里面的scope属性--singleton
@Test
public void t3() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("测试scope属性 --singleton");
User user = (User) context.getBean("user");
User user1 = (User) context.getBean("user");
System.out.println(user);
System.out.println(user1);
}
prototype: 多实例
配置文件只要一加载 不创建该实例对象
当所有人过来要的时候(getBean("user")) 才创建该实例对象 放在spring容器中
注意:获取一次 创建一次 放在spring容器中
prototype: 多实例
如果是多实例,配置文件加载,不创建对象
当每个人过来getbean的时候,getbean一次创建一次 放在容器中
<bean id="user" class="com.it.bean.User" scope="prototype"></bean>
@Test // 测试scope属性 --prototype
public void t4() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("测试scope属性 --prototype");
User user = (User) context.getBean("user");
User user1 = (User) context.getBean("user");
System.out.println(user);
System.out.println(user1);
}
问:什么时候用默认值singleton(单实例)? 什么时候用prototype(多实例)?
action: prototype
service/dao: singleton
init-method属性: 指定初始化的方法
destory-method属性:指定销毁的方法
singleton:
初始化:配置文件加载的时候 创建对象并且初始化
销毁:容器销毁 对象跟着销毁
prototype:
初始化:当getbean()的时候 创建对象并且初始化
销毁: 长时间不用 java垃圾回收自动回收
singleton的对象什么时候销毁? prototype创建出来的对象什么时候销毁?
singleton的对象当spring容器关闭 对象销毁
prototype的对象 长时间不用自动被垃圾回收机制给回收了
init-method:指定初始化方法
destory-method:指定销毁方法
<bean id="user" class="com.it.bean.User" scope="singleton" init-method="init" destroy-method="destory"></bean>
<bean id="user" class="com.it.bean.User" scope="prototype" init-method="init" destroy-method="destory"></bean>
// 测试scope属性(singleton)---初始化时机和销毁时机
// 初始化: 当对象被创建出来就执行初始化方法 配置文件一加载
// 销毁: 容器关闭 对象销毁
@Test
public void t5() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("测试(singleton)---初始化时机和销毁时机");
User user = (User) context.getBean("user");
User user1 = (User) context.getBean("user");
System.out.println(user);
System.out.println(user1);
//关闭容器
context.close();
}
// 测试scope属性(prototype)---初始化时机和销毁时机
// 初始化: 当对象被创建出来就执行初始化方法 getbean的时候
// 销毁: 长时间不用 被垃圾回收机制销毁
@Test
public void t6() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("测试(prototype)---初始化时机和销毁时机");
User user = (User) context.getBean("user");
User user1 = (User) context.getBean("user");
System.out.println(user);
System.out.println(user1);
//关闭容器
context.close();
}
singleton的创建和销毁:
prototype创建和销毁:
import标签:导入外部的配置文件
resource属性:外部配置文件的地址
4 import:导入外部的配置文件
resource:外部配置文件的地址
web: 所有在web层创建的对象 applicationContext_web.xml
service:所有在service层创建的对象 applicationContext_service.xml
dao:所有在dao层创建的对象 applicationContext_dao.xml
<import resource="applicationContext_web.xml"/>
<import resource="applicationContext_service.xml"/>
<import resource="applicationContext_dao.xml"/>
测试用的创建了一个applicationContext_user.xml文件
<import resource="applicationContext_user.xml"/>
三、bean的三种创建方式
无参构造方式
静态工厂方式(了解)
实例工厂方式(了解)
无参构造方式
无参构造方式
<bean id="user" class="com.it.bean.User"></bean>
@Test // 测试bean的三种创建方式--无参构造器
public void t7() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user =(User) context.getBean("user");
user.run();
}
静态工厂方式(了解):条件:需要先有个工厂
工厂类
package com.it.utils;
import com.it.bean.User;
public class BeanFactory {
// 静态方法---静态工厂
public static User createUser() {
return new User();
}
}
xml配置
<bean id="user" class="com.it.utils.BeanFactory" factory-method="createUser"></bean>
@Test // 测试bean的三种创建方式--静态工厂方式
public void t8() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("静态工厂方式");
User user =(User) context.getBean("user");
User user1 =(User) context.getBean("user");
System.out.println(user);
System.out.println(user1);
}
实例工厂方式(了解)
工厂类
package com.it.utils;
import com.it.bean.User;
public class BeanFactory {
// 普通方法---实例工厂
public User createUser() {
return new User();
}
}
xml
<!-- 实例工厂(了解)
条件:需要有一个工厂类 在这个工厂类中还需要有一个普通方法
-->
<bean id="beanFactory" class="com.it.utils.BeanFactory"></bean>
<bean id="user" factory-bean="beanFactory" factory-method="createUser"></bean>
java测试代码
@Test // 测试bean的三种创建方式--实例工厂方式
public void t9()
{
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("实例工厂方式测试...");
User user=(User)context.getBean("user");
User user2=(User)context.getBean("user");
System.out.println(user);
System.out.println(user2);
}