• Spring(三)IoC 相关内容


    一、bean 基础配置

    1. bean的id与class属性

    2. bean的name属性

    3. bean作用范围scope配置

     思考:

    (1)为什么bean默认为单例?

    1️⃣bean为单例的意思是在Spring的IoC容器中只会有该类的一个对象

    2️⃣bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
    (2)bean在容器中是单例的,会不会产生线程安全问题

    1️⃣如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,因为所有请求线程共用一个bean对象,所以会存在线程安全问题

    2️⃣如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题

    (3)哪些bean对象适合交给容器进行管理?

    表现层对象、业务层对象、数据层对象、工具对象

    (4)哪些bean对象不适合交给容器进行管理?

    封装实例的域对象,因为会引发线程安全问题,所以不适合。

    二、bean 实例化

    bean 本质上就是对象,对象在 new 的时候会使用构造方法完成,那创建 bean 也是使用构造方法完成的。
    实例化  bean  的三种方式: 构造方法(常用) 静态工厂(了解) 实例工厂、 实例工厂的FactoryBean(实用)

    1. 静态工厂实例化

    (1) 准备一个 OrderDao OrderDaoImpl
    1. public interface OrderDao {
    2. void save();
    3. }
    1. public class OrderDaoImpl implements OrderDao {
    2. @Override
    3. public void save() {
    4. System.out.println("order dao save...");
    5. }
    6. }

    (2) 创建一个工厂类 OrderDaoFactory 并提供一个 静态方法
    1. public class OrderDaoFactory {
    2. public static OrderDao getOrderDao() {
    3. System.out.println("factory setup...");
    4. return new OrderDaoImpl();
    5. }
    6. }
    (3) spring 的配置文件 application.properties 中添加以下内容 :
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
    6. beans>
    class: 工厂类的类全名
    factory-mehod: 具体工厂类中创建对象的方法名
    (4) AppForInstanceOrder 运行类,使用从 IOC 容器中获取 bean 的方法进行运行测试
    1. /**
    2. * bean的实例化方式:静态工厂
    3. */
    4. public class AppForInstanceOrder {
    5. public static void main(String[] args) {
    6. //通过静态工厂创建对象
    7. // OrderDao orderDao = OrderDaoFactory.getOrderDao();
    8. // orderDao.save();
    9. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    10. OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
    11. orderDao.save();
    12. }
    13. }

    2. 实例工厂实例化

    (1)准备一个 UserDao UserDaoImpl

    1. public interface UserDao {
    2. void save();
    3. }
    1. public class UserDaoImpl implements UserDao {
    2. @Override
    3. public void save() {
    4. System.out.println("user dao save...");
    5. }
    6. }
     (2) 创建一个工厂类 OrderDaoFactory 并提供一个普通方法
    1. public class UserDaoFactory {
    2. public UserDao getUserDao() {
    3. System.out.println("factory setup...");
    4. return new UserDaoImpl();
    5. }
    6. }
    (3) spring 的配置文件 application.properties 中添加以下内容 :
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
    6. <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
    7. beans>

     

    (4) AppForInstanceOrder 运行类,使用从 IOC 容器中获取 bean 的方法进行运行测试
    1. /**
    2. * bean的实例化方式:实例工厂
    3. */
    4. public class AppForInstanceUser {
    5. public static void main(String[] args) {
    6. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    7. UserDao userDao = (UserDao) ctx.getBean("userDao");
    8. userDao.save();
    9. }
    10. }

    3. FactoryBean 的使用(实例工厂实例化)(***)

    普通实例工厂实例化,配置复杂,可以优化 

     (1) 创建一个 UserDaoFactoryBean 的类,实现 FactoryBean 接口,重写接口的方法
    1. public class UserDaoFactoryBean implements FactoryBean {
    2. //代替原始实例工厂中创建对象的方法
    3. @Override
    4. public UserDao getObject() throws Exception {
    5. return new UserDaoImpl();
    6. }
    7. @Override
    8. public Class getObjectType() {
    9. return UserDao.class;
    10. }
    11. @Override
    12. public boolean isSingleton() {
    13. //true:单例
    14. //false:非单例
    15. return false;
    16. }
    17. }
    方法一 :getObject() ,被重写后,在方法中进行对象的创建并返回
    方法二: getObjectType(), 被重写后,主要返回的是被创建类的 Class 对象
    方法三: 没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true
    (2) spring 的配置文件 application.properties 中添加以下内容 :
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
    6. beans>

    三、bean 的生命周期

    生命周期:从创建到消亡的完整过程
    bean生命周期:bean从创建到销毁的整体过程
    bean生命周期控制:在bean创建后到销毁前做一些事情

    1. 代码实现(配置生命周期控制方法)

    (1) 项目中添加 BookDao BookDaoImpl BookService BookServiceImpl
    1. public class BookDaoImpl implements BookDao {
    2. @Override
    3. public void save() {
    4. System.out.println("book dao save...");
    5. }
    6. //表示bean初始化对应的操作
    7. public void init() {
    8. System.out.println("init...");
    9. }
    10. //表示bean销毁前对应的操作
    11. public void destory() {
    12. System.out.println("destory...");
    13. }
    14. }
    (2)resources 下提供 spring 的配置文件
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"
    6. init-method="init" destroy-method="destory" />
    7. beans>
     (4) AppForLifeCycle 运行类, 进行运行测试
    1. public class AppForLifeCycle {
    2. @Test
    3. public void test1() {
    4. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    5. BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    6. bookDao.save();
    7. //暴力关闭容器
    8. ctx.close();
    9. }
    10. @Test
    11. public void test2() {
    12. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    13. // 任意位置
    14. ctx.registerShutdownHook();
    15. BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    16. bookDao.save();
    17. }
    18. }

    2. 代码实现(接口控制,了解)

    1. public class BookServiceImpl implements BookService,
    2. InitializingBean, DisposableBean {
    3. private BookDao bookDao;
    4. @Override
    5. public void save() {
    6. System.out.println("book service save...");
    7. bookDao.save();
    8. }
    9. public void setBookDao(BookDao bookDao) {
    10. this.bookDao = bookDao;
    11. }
    12. @Override
    13. public void destroy() throws Exception {
    14. System.out.println("service destory");
    15. }
    16. //属性设置完成后触发
    17. @Override
    18. public void afterPropertiesSet() throws Exception {
    19. System.out.println("service init");
    20. }
    21. }
  • 相关阅读:
    远程代码托管平台--GitHub、Gitee的使用
    accelerate 分布式技巧实战--部署ChatGLM-6B(三)
    console对象与控制台
    软件流程和管理(八):质量管理
    PolarDB-X 源码解读:事务的一生
    vue封装一个3D轮播图组件
    【一天学awk】基础中的基础
    vue+python把woff字体文件中的字体全部读取出来
    udp接收队列以及多次初始化的测试
    Win7 IIS7解析漏洞复现
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/127680090