基本操作-基于xml配置方式组件管理

组件信息声明配置(IOC 控制反转)

HappyComponent
package com.wind.ioc_01;
public class HappyComponent {
    //默认包含无参数构造函数
    public void doWork() {
        System.out.println("HappyComponent.doWork");
    }
}
ClientService DefaultServiceLocator
package com.wind.ioc_01;

public class ClientService {
  private static ClientService clientService = new ClientService();
  private ClientService() {}

  public static ClientService createInstance() {
    return clientService;
  }
}

package com.wind.ioc_01;

public class DefaultServiceLocator {

  private static ClientServiceImpl clientService= new ClientServiceImpl();

  public ClientServiceImpl createClientServiceInstance() {
    return clientService;
  }
}
<?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">
<!--组件配置-->
    <!--    1.使用无参数构造函数创建(实例化)的组件  如何进行ioc配置
     - bean标签:通过配置bean标签告诉IOC容器需要创建 对象 的组件信息
    - id属性: bean的唯一标识,方便后期获取Bean!
    - class属性: 组件类的全限定符!(包名 + 类名)
    - 注意:要求当前组件类必须包含无参数构造函数!
     -->
<!--    将一个组件类  声明两个组件信息  会实例化两个组件对象 (默认是单例模式)-->
    <bean id="happyComponent1" class="com.wind.ioc_01.HappyComponent"></bean>
    <bean id="happyComponent2" class="com.wind.ioc_01.HappyComponent"></bean>
    <!-- 在编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法;
    (如果自己手动添加构造函数,无论有参数或是没参数,默认构造函数都将无效)
    编写时添加有参构造方法而未添加无参构造方法,那么编译器只认有参构造方法而不会默认添加无参构造方法。
    如果需要使用无参构造方法,一定要在类里面添加 -->

    <!--   2. 工厂模式实例化对象。定义使用静态工厂方法进行 ioc的配置
    factory-method: 指定静态工厂方法,注意,该方法必须是static方法
    -->
    <bean id="clientService" class="com.wind.ioc_01.ClientService" factory-method="createInstance"></bean>

    <!--   3. 实例工厂方法实例化 使用实例工厂方法进行 ioc的配置-->
    <!--   3.1.先将工厂类进行ioc配置 -->
    <bean id="defaultServiceLocator" class="com.wind.ioc_01.DefaultServiceLocator"></bean>

    <!-- 3.2.根据工厂对象的实例工厂方法进行实例化组件对象
     - factory-bean属性:指定当前容器中工厂Bean 的名称。
    - factory-method:  指定实例工厂方法名。注意,实例方法必须是非static的!
-->
    <bean id="clientService2" factory-bean="defaultServiceLocator" factory-method="createClientServiceInstance"></bean>
</beans>

组件 依赖注入(DI) 配置

UserDao UserService
public class UserDao {
}

public class UserService {
    
    private UserDao userDao;
    private int age;

    private String name;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
    public UserService(int age , String name ,UserDao userDao) {
        this.userDao = userDao;
        this.age = age;
        this.name = name;
    }
}
MovieFinder
public class MovieFinder {
}

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  
  private String movieName;

  public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
  }
  
  public void setMovieName(String movieName){
    this.movieName = movieName;
  }
}
<?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">
    <!--ioc  注入(DI)的配置-->

    <!--   1. 基于构造函数的依赖注入  单参数-->
    <bean id="userDao" class="com.wind.ioc_02.UserDao"/>
    <bean id="userService" class="com.wind.ioc_02.UserService">
        <!--       构造函数引用  这里填入构造器需要的参数-->
        <constructor-arg ref="userDao"></constructor-arg>
    </bean>

    <!--   2. 基于构造函数的依赖注入(多构造参数解析)-->
    <bean id="userService2" class="com.wind.ioc_02.UserService">
        <!--   name属性指定参数名、
        ref 引用其他bean的标识。
        index属性指定参数角标、
        value属性指定基本类型值-->
        <!--      在填入参数时 存在三种方式  1.按顺序填写 2.按参数名填写  (强烈推荐)  3.按索引填写  -->
        <!--        参数名填写-->
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="name" value="王二狗"></constructor-arg>
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>

        <!--顺序填写
        <constructor-arg value="18"></constructor-arg>
        <constructor-arg  value="王二狗"></constructor-arg>
        <constructor-arg  ref="userDao"></constructor-arg>
        按索引填写
        <constructor-arg index="0" value="18"></constructor-arg>
        <constructor-arg index="1" value="王二狗"></constructor-arg>
        <constructor-arg index="2" ref="userDao"></constructor-arg> -->
    </bean>
    <!-- 3. 基于Setter方法依赖注入   -->
    <bean id="movieFinder" class="com.wind.ioc_02.MovieFinder"></bean>
    <bean id="simpleMovieLister" class="com.wind.ioc_02.SimpleMovieLister">
        <!-- setter方法,注入movieFinder对象的标识id
      name = set方法标识(取值时 去掉 set 以及set后的第一个字母小写)
        ref = 引用bean的id值 -->
        <property name="movieFinder" ref="movieFinder"></property>
<!--        value属性代表基本属性值-->
        <property name="movieName" value="二狗"></property>
    </bean>
</beans>
posted @ 2023-09-12 22:16  微风抚秀发  阅读(40)  评论(0)    收藏  举报