JavaEE开发框架SSM 003Bean

    xiaoxiao2025-06-19  7

    Spring中的Bean你可以认为是任何一个POJO类

    如果想要实现IOC就得使用容器,那么容器怎么知道你有哪些类呢?你得通过某种方式告诉容器,我有叫做什么什么的类,它的位置在哪里哪里。

     

    常用的配置Bean的方法就是使用xml进行配置

     

    常用的bean的属性,或者字段有以下这些:

    常见的属性是id和class两个属性,id代表这个Bean的名称,就跟你叫张三,他叫李四一样。class代表的是你定义这个类的位置,在哪个文件夹下面,哪个包下面,叫什么名字,顺着这个位置信息我可以找到这个类定义的位置。

    <bean id="bean1" class="com.itheima.Bean1"/> <bean id="bean2" class="com.itheima.Bean2"/>

     

    Bean的实例化

     

    常见的Bean的实例化方式有三种,构造函数实例化(常用),静态工厂实例化,实例工厂实例化

     

    1. 构造函数实例化

    使用无参构造方法进行实例化。

    创建一个POJO

    注册一个Bean

    测试一下

    完全没有问题。

     

    2. 静态实例工厂实例化

    根据设计模式的说法,我们可以通过静态工厂来创建对象。

    创建一个普通的POJO

    public class Bean2{ }

    创建实例工厂

    注册到容器中

    注意了!这里配置Bean的时候,路径是静态工厂类的路径,还配置了factory-method来指定使用哪个方法实例化对象。

    测试一下

     

    3.实例工厂实例化

    使用实例化工厂再去实例化对象

    创建一个POJO

    public class Bean3{ }

    创建实例工厂

    注册到容器

    注意了!先注册了实例工厂的Bean,然后,在需要实例化的Bean中设置factory-bean引用上述的实例工厂Bean,设置factory-method设置实例化对象调用的实例化工厂的方法名。

    测试一下

     

    小结:

    使用构造函数进行依赖注入是比较常用的方法,简单。

    使用静态工厂进行配置的时候,只需要配置静态工厂方法即可,路径是静态工厂的路径,使用factory-method来指定方法名。

    使用实例工厂进行配置的时候,需要配置实例工厂类,也需要配置待实例化的类,添加factory-bean引用实例工厂的Bean,使用factory-method配置实例化的时候需要调用的方法。

     

     

    Bean的作用域

     

     

    默认情况下,是singleton,全局就一个Bean的实例,也就是单例,对于无会话状态的Bean是最合适的。

    prototype就是另外一个极端了,每次需要创建的时候,他都会new一个实例出来。

    后面的几种就是分情况了,常用的就是request,一次请求有一个实例,还有session同一个浏览器的会话使用一个实例。

     

    可以在xml文件注册bean的时候指定scope,默认就是singleton

    可以看到,两个对象是同一个:

     

    对于prototype:

    可以看到是两个完全不同的对象:

     

    可以对Bean的生命周期进行管理,使用init-method指定初始化的时候调用的方法,使用destory-method指定bean销毁的时候调用的方法。

     

    装配Bean

     

    1. 基于xml文件

     

    a 使用构造函数进行依赖注入

     

    通过构造函数进行注入

    指定使用constructor-arg进行注入

    使用index确定参数的次序,从0开始。value是简单的值,对于复杂的list需要使用list标签包裹起来。

     

    b 使用setter方法进行依赖注入

     

    通过setter方法注入

    通过property进行注入:

    name指定字段的名称,value指定简单值。复杂的list需要使用list包裹。

     

    复杂类型的装配:

    2. 基于注解

     

    注解是最常用的依赖注入的方式了,常见的注解有:

    @Component表示一个Bean

    @Repository代表数据访问层的Bean

    @Service代表业务逻辑层的Bean

    @Controller代表控制器Bean

    @Autowired对于变量,setter方法,构造方法进行注解,配合进行注入

    @Resource作用与@Autowired类似,使用name注解Bean的名称,type注解Bean的类型。

    @Qualifier对于多实现的接口进行注入的时候,指定是哪个实现

     

    定义一个Dao接口:

    定义Dao实现类:

    定义Service接口:

    定义Service实现类:

    这里就使用了@Resource配合依赖注入

    修改配置文件:

    <?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:annotation-config /> <context:component-scan base-package="com.learn.ioc" /> </beans>

    测试

    效果

     

     

    最新回复(0)