【spring(一)】核心容器总结

简介: 【spring(一)】核心容器总结

🌈键盘敲烂,年薪30万🌈

 



IOC 配置bean对象:

配置文件配置bean

       id:bean的名称

       class:bean的类型

<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl"/>

DI 注入bean对象

①.setter方法注入

       setter方法注入 使用<properties> 标签,通过set方法为bean对象赋值,推荐使用

注入引用类型

       name = "xxx" ref = "xxx"

       name后面要与set方法的形参保持一致,ref要与bean的id保持一致

<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl">
    <properties name = "bookDao" ref = "bookDao"/>
</bean>

注入基本数据类型

       name = "xxx" value = "xxx"

<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl">
    <properties name = "IdCard" value = "123"/>
</bean>

注入集合数组等类型

       当集合类型进行注入时,使用相应标签(list、set、array、map...)对属性值进行注入。

<bean id="school" class="com.muyu.pojo.School">
  <property name="classes">
    <list>
      <value>10</value>
      <value>11</value>
      <value>12</value>
    </list>
    <!--
    1. array集合
    <array>
      <value></value>
    </array>
    2. set集合
    <set>
      <value></value>
    </set>
    3. map集合
    <map>
      <entry value="" ket=""></entry>
    </map>
    -->
  </property>
</bean> 
②.构造器注入

       构造器注入,使用<constructor-arg>标签,在整合第三方框架的时候使用

<bean id = "bookDao" class = "com.itpan.Dao.impl.BookDaoImpl">
    <constructor-arg name = "bookDao" ref = "bookDao"/>
</bean>

   setter注入和构造器注入并无太大区别,一个是运用setter方法,一个是运用构造器,构造器注入将properties标签改完constructor-arg 即可。

Bean的实例化

1.setter方法注入(重点)

       在相应类中提供set方法

public class BookServiceImpl implements Bookservice {
    BookDao bookDao;
    @Override
    public void save() {
        System.out.println("Bookservice save is running");
        bookDao.save();
    }
 
    //提供set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
2.静态工厂(了解)
public class BookDao1Factory {
    public static BookDao1 getBookDao1(){
        System.out.println("BookDao1Factory null constructor is running");
        return new BookDao1Impl();
    }
}
3.实例工厂(了解)

       跟setter方法冗余,不再赘述。

4.FactoryBean方式注入(重点)

       创建一个FactoryBean的类,实现factorybean<E>接口,用于实例化bean对象,通过getObject创建对象,getObjectType指定对象类型。

package itpan.factory;
 
import itpan.Dao.BookDao1;
import itpan.Dao.impl.BookDao1Impl;
import org.springframework.beans.factory.FactoryBean;
 
public class BookDao1FactoryBean implements FactoryBean<BookDao1> {
    // 替代静态静态工厂中的get方法
    @Override
    public BookDao1 getObject() throws Exception {
        return new BookDao1Impl();
    }
 
    // 创建的bean是什么类型的
    @Override
    public Class<?> getObjectType() {
        return BookDao1.class;
    }
}

 

bean的声明周期

  • 执行构造方法实例化bean对象
  • 设置属性
  • 初始化
  • 关闭容器bean自动销毁

例如以下程序:

package itpan.Dao.impl;
 
import itpan.Dao.BookDao1;
import itpan.Dao.BookDao2;
import itpan.Dao.BookDao3;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
 
public class BookDao1Impl implements BookDao1, InitializingBean, DisposableBean {
    BookDao2 bookDao2;
    BookDao3 bookDao3;
 
    public void setBookDao2(BookDao2 bookDao2) {
        this.bookDao2 = bookDao2;
    }
 
    public void setBookDao3(BookDao3 bookDao3) {
        this.bookDao3 = bookDao3;
    }
 
    public void save() {
        System.out.println("bookdao1 is running");
        bookDao2.save();
        bookDao3.save();
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("dao init...");
    }
 
    @Override
    public void destroy() throws Exception {
        System.out.println("dao close...");
    }
} 

测试类:

package itpan;
 
import itpan.Dao.BookDao1;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class TestBeanCycle {
    public static void main(String[] args) {
        // bean的生命周期
        // 1.new bean
        // 2.执行构造方法
        // 3.set设置属性
        // 4.init初始化bean
 
        // 容器关闭触发bean的销毁
        // 两种方法
        // 1.手工关闭 2.注册关闭钩子
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 设置关闭钩子
        ctx.registerShutdownHook();
 
        BookDao1 bookDao1 = (BookDao1) ctx.getBean("bookDao1");
        bookDao1.save();
//        ctx.close();
    }
}

注意:

创建bean对象默认调用空参构造,如果没有空参构造,程序会抛出异常。

bean的自动装配

很简单,在配置bean对象时将autowrie属性设置为true

<bean id="bookDao1" class="itpan.Dao.impl.BookDao1Impl" autowire="byType"/>

管理第三方的bean

1.引入properties文件

2.开启context命名空间

3.使用context:property-placeholder加载命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
 
    <!--引入properties文件-->
    <!--1.开启context命名空间-->
    <!--2.使用context加载命名空间-->
    <context:property-placeholder location="classpath*:*.properties"/>
 
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>


相关文章
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
16天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
28天前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
47 0
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
79 0
|
3月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
149 3
|
4月前
|
XML Java 数据格式
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
这篇文章详细介绍了Spring框架中IOC容器的Bean管理,特别是基于XML配置方式的实现。文章涵盖了Bean的定义、属性注入、使用set方法和构造函数注入,以及如何注入不同类型的属性,包括null值、特殊字符和外部bean。此外,还探讨了内部bean的概念及其与外部bean的比较,并提供了相应的示例代码和测试结果。
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
|
4月前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)
|
4月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)