组件信息声明配置(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>