一、入门案例
一、新建maven项目
项目名称为
二、编辑pom.xml文件
打包方式为jar
添加spring框架的依赖
三、创建Account操作相关类和接口
1、Dao层接口以及其实现类
2、service层接口以及其实现类
3、模拟客户端调用
(1)编写IAccountDao接口
写入saveAccount方法,模拟保存一个账户
package com.itheima.dao;
public interface IAccountDao {
void saveAccount();
}
(2)编写dao接口的实现类
package com.itheima.dao.impl;
import com.itheima.dao.IAccountDao;
public class AccountDaoImpl implements IAccountDao {
public void saveAccount() {
System.out.println("保存账户");
}
}
(3)编写IAccountService接口
package com.itheima.service;
public interface IAccountService {
void saveAccount();
}
(4)编写service接口的实现类
package com.itheima.service.impl;
import com.itheima.dao.impl.AccountDaoImpl;
import com.itheima.service.IAccountService;
public class AccountServiceImpl implements IAccountService {
AccountDaoImpl accountDaoImpl = new AccountDaoImpl();
public void saveAccount() {
accountDaoImpl.saveAccount();
}
}
四、新建bean.xml(重要)
新建xml文件
详见注释:
这里填写了bean对象的唯一标识id,后面将通过这个唯一标识id来找到对应的创建对象的类的字节码
<?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为accountService ,class填写的是实现类的全限定类名-->
<!--这里分别为Service和Dao的接口的实现类-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>
</beans>
五、模拟客户端调用(重要)
getBean后面就是填写的bean.xml中,每个bean标签的唯一标识id,IOC就是通过这个唯一标识id,来找到要创建的对象的类,通过反射创建一个类对象(这里是通过默认构造器来创建的,其他方式创建后面会讲)
package com.itheima.ui;
import com.itheima.dao.impl.AccountDaoImpl;
import com.itheima.service.impl.AccountServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
public static void main(String[] args) {
//获取spring的IOC核心容器,并根据id获取对象
//1、获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2、根据容器对象来创建类对象
AccountDaoImpl ad = (AccountDaoImpl) ac.getBean("accountDao");
AccountServiceImpl as = ac.getBean("accountService",AccountServiceImpl.class);
//3、执行对象方法
as.saveAccount();
}
}
以及,上面创建对象的时候用了两种方法,我们ctrl+F3点进getBeam方法,可以看到
第一个:传入一个id字符串,返回的是object类型,所以需要强转
第二个:传入id字符串,以及要创建的类T的字节码对象,返回的就是该类T,无需强转
(其实这里的AccountDaoImpl对象创建起来并没有什么用,因为我们在创建as对象的时候已经初始化了AccountDaoImpl对象,而且也发现在这个main方法中并没有用到AccountDaoImpl对象,在这里只是为了说明有两种常用创建方法)
运行结果:
二、创建对象的三种方式
一、默认构造函数创建
上面的入门案例中的bean的写法,就是通过默认构造函数创建,可以来验证一下,我们对AccountServiceImpl类进行改造:
运行失败:
二、通过工厂创建对象
通过工厂的newAccountServiceInstance方法返回一个AccountServiceImpl对象
package com.itheima.factory;
import com.itheima.service.impl.AccountServiceImpl;
public class AccountServiceFactory {
public AccountServiceImpl newAccountServiceInstance(){
return new AccountServiceImpl();
}
}
那么bean中的写法:
在main方法中,通过调用AccountServiceImpl as = ac.getBean("accountService",AccountServiceImpl.class);
找到id为accountService的bean,通过bean标签中的factory-bean
以及factory-method
得知是工厂类创建的对象,由factory-bean="accountFactory"
找到id
为accountFactory
的bean,通过工厂类的bean实例化一个工厂对象,再执行工厂类中factory-method
里的方法
三、静态工厂创建对象
只需将工厂类中的方法改为静态方法:
bean的写法如下:
由于静态方法是属于类的,所以我们可以直接利用class="com.itheima.factory.AccountServiceFactory"
来找到这个工厂类,然后填写对应的方法:factory-method="newAccountServiceInstance"
即可
<bean id="accountService" class="com.itheima.factory.AccountServiceFactory"
factory-method="newAccountServiceInstance"></bean>
三、bean的作用域
通过bean的scope属性指定
singleton:单例(默认)
prototype:多例
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用域集群环境的会话范围(全局会话范围),若不是集群环境,就是session
四、bean的生命周期
单例对象:
出生:容器创建就生成对象
活着:容器活着对象就活着
死亡:容器销毁关闭 对象就死亡
总结:同生共死
多例对象:
出生:对象被使用的时候生成
活着:对象只要在使用过程中就活着
死亡:对象长时间不用,被java垃圾回收机制回收
总结:有用的时候诞生,自然死亡