Spring

作者: Jesse_996 | 来源:发表于2019-08-28 13:23 被阅读0次

    实例化Bean三种方式:

    一.使用默认无参构造函数

    在默认情况下:
    它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。

    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>
    

    二.spring 管理静态工厂-使用静态工厂的方法创建对象

    /**
    * 模拟一个静态工厂,创建业务层实现类
    */
    public class StaticFactory {
    public static IAccountService createAccountService(){
    return new AccountServiceImpl();
    }
    }
    <!-- 此种方式是:
    使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器
    id 属性:指定 bean 的 id,用于从容器中获取
    class 属性:指定静态工厂的全限定类名
    factory-method 属性:指定生产对象的静态方法
    -->
    <bean id="accountService"
    class="com.itheima.factory.StaticFactory"
    factory-method="createAccountService"></bean>
    

    三.spring 管理实例工厂-使用实例工厂的方法创建对象

    /**
    * 模拟一个实例工厂,创建业务层实现类
    * 此工厂创建对象,必须现有工厂实例对象,再调用方法
    */
    public class InstanceFactory {
    public IAccountService createAccountService(){
    return new AccountServiceImpl();
    }
    }
    <!-- 此种方式是:
    先把工厂的创建交给 spring 来管理。
    然后在使用工厂的 bean 来调用里面的方法
    factory-bean 属性:用于指定实例工厂 bean 的 id。
    factory-method 属性:用于指定实例工厂中创建对象的方法。
    -->
    <bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean>
    <bean id="accountService"
    factory-bean="instancFactory"
    factory-method="createAccountService"></bean>
    

    spring 的依赖注入

    依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。
    我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。
    ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。
    那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。
    简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

    1.构造函数注入

    顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置
    的方式,让 spring 框架来为我们注入。具体代码如下:
    /**
    */
    public class AccountServiceImpl implements IAccountService {
    private String name;
    private Integer age;
    private Date birthday;
    public AccountServiceImpl(String name, Integer age, Date birthday) {
    this.name = name;
    this.age = age;
    this.birthday = birthday;
    }
    @Override
    public void saveAccount() {
    System.out.println(name+","+age+","+birthday);
    }
    }
    <!-- 使用构造函数的方式,给 service 中的属性传值
    要求:
    类中需要提供一个对应参数列表的构造函数。
    涉及的标签:
    constructor-arg
    属性:
    index:指定参数在构造函数参数列表的索引位置
    type:指定参数在构造函数中的数据类型
    name:指定参数在构造函数中的名称 用这个找给谁赋值
    =======上面三个都是找给谁赋值,下面两个指的是赋什么值的==============
    value:它能赋的值是基本数据类型和 String 类型
    ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean
    -->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <constructor-arg name="name" value=" 张三 "></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="now"></constructor-arg>
    </bean>
    <bean id="now" class="java.util.Date"></bean>
    

    2.set 方法注入

    顾名思义,就是在类中提供需要注入成员的 set 方法。具体代码如下:
    /** */
    public class AccountServiceImpl implements IAccountService {
    private String name;
    private Integer age;
    private Date birthday;
    public void setName(String name) {
    this.name = name;
    }
    public void setAge(Integer age) {
    this.age = age;
    }
    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }
    @Override
    public void saveAccount() {
    System.out.println(name+","+age+","+birthday);
    }
    }
    <!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式
    涉及的标签:
    property
    属性:
    name:找的是类中 set 方法后面的部分
    ref:给属性赋值是其他 bean 类型的
    value:给属性赋值是基本数据类型和 string 类型的
    实际开发中,此种方式用的较多。
    -->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <property name="name" value="test"></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="now"></property>
    </bean>
    <bean id="now" class="java.util.Date"></bean>

    相关文章

      网友评论

          本文标题:Spring

          本文链接:https://www.haomeiwen.com/subject/rqmpectx.html