IoC

作者: 莫以有 | 来源:发表于2019-03-05 09:44 被阅读0次

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中

以上不太懂,不做任何解释

我们来看例子:

  • 修改服务器类
public interface MessageService {
    String getMessage();
}
  • 创建实现类,用于返回值
public class MessageServiceImpl implements MessageService {
    private String username;
    private int age;

    public MessageServiceImpl(String username, int age) {
        this.username = username;
        this.age = age;
    }
    public String getMessage(){
        return "Hello World!"+ username +",age is"+ age;
    }
  • 修改打印器
public class MessagePrinter {
    final private  MessageService service;
    public MessagePrinter(MessageService service){
        this.service=service;
    }
    public void printMessage(){
        System.out.println(this.service.getMessage());
    }
  • 修改应用主类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args) {
        @SuppressWarnings("resources")
        ApplicationContext context =new
                ClassPathXmlApplicationContext("beans.xml");
        MessagePrinter printer =context.getBean(MessagePrinter.class);
        printer.printMessage();
    }
  • 创建配置文件
 <bean id="messageServiceImpl" class="com.spring.spring.ioc.MessageServiceImpl">
        <constructor-arg name="username" value="li"></constructor-arg>
        <constructor-arg name="age" value="21"></constructor-arg>
    </bean>
    <bean id="messagePrinter" class="com.spring.spring.ioc.MessagePrinter">
        <constructor-arg name="service" ref="messageServiceImpl"></constructor-arg>
    </bean>
  • 运行结果
result.png

依赖注入的详细配置:

  • 直接赋值
<property name="" value=""/>
  • 引用其他bean
<ref bean="somebean"/>
  • 内部bean
  • 集合
    <list>,<set>,<map>,<props>用于配置集合类型的属性和参数
  • null及空字符的值
  • xml短域名空间
  • 复合属性名称

集合的一个例子

  • 定义三个类
public class Car {                                                                                 
    private String brand;
    private String color;
    private String parameter;
    public Car(String brand, String color, String parameter) {
        this.brand = brand;
        this.color = color;
        this.parameter = parameter;
    }
    public Car() {
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getParameter() {
        return parameter;
    }
    public void setParameter(String parameter) {
        this.parameter = parameter;
    }
    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", color='" + color + '\'' +
                ", parameter='" + parameter + '\'' +
                '}';
    }
import java.util.List;
public class Boss {
    private String name;
    private String Company;
    private Car car;
    private List<String> hobbies;
    public Boss(String name, String company, Car car, List<String> hobbies) {
        this.name = name;
        Company = company;
        this.car = car;
        this.hobbies = hobbies;
    }
    public Boss() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCompany() {
        return Company;
    }
    public void setCompany(String company) {
        Company = company;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    public List<String> getHobbies() {
        return hobbies;
    }
    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }
    @Override
    public String toString() {
        return "Boss{" +
                "name='" + name + '\'' +
                ", Company='" + Company + '\'' +
                ", car=" + car +
                ", hobbies=" + hobbies +
                '}';
    }
import java.util.List;

public class Meeting {
    private String theme;
    private List<Boss> bosses;

    public Meeting(String theme, List<Boss> bosses) {
        this.theme = theme;
        this.bosses = bosses;
    }

    public Meeting() {
    }

    public String getTheme() {
        return theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }

    public List<Boss> getBosses() {
        return bosses;
    }

    public void setBosses(List<Boss> bosses) {
        this.bosses = bosses;
    }

    @Override
    public String toString() {
        return "Meeting{" +
                "theme='" + theme + '\'' +
                ", bosses=" + bosses +
                '}';
    }
  • 配置文件
 <bean id="car1" class="com.spring.spring.meeting.Car">
        <constructor-arg name="brand" value="小汽车"/>
        <constructor-arg name="color" value="黑色"/>
        <constructor-arg name="parameter" value="4.0T"/>
    </bean>

    <bean id="car2" class="com.spring.spring.meeting.Car">
        <constructor-arg name="brand" value="公交车"/>
        <constructor-arg name="color" value="白色"/>
        <constructor-arg name="parameter" value="3.8T"/>
    </bean>

    <bean id="car3" class="com.spring.spring.meeting.Car">
        <property name="brand" value="浅灰"/>
        <property name="color" value="灰色"/>
        <property name="parameter" value="4.5T"/>
    </bean>
 <bean id="boss1" class="com.spring.spring.meeting.Boss">
        <constructor-arg name="name" value="马云"/>
        <constructor-arg name="company" value="阿里巴巴"/>
        <constructor-arg name="car" ref="car1"/>
        <constructor-arg name="hobbies">
            <list>
                <value>读书</value>
                <value>看新闻</value>
            </list>
        </constructor-arg>
    </bean>

    <bean id="boss2" class="com.spring.spring.meeting.Boss">
        <property name="name" value="马化腾"/>
        <property name="company" value="腾讯"/>
        <property name="car" ref="car2"/>
        <property name="hobbies">
            <list>
                <value>打游戏</value>
                <value>看电影</value>
            </list>
        </property>
    </bean>

    <bean id="boss3" class="com.spring.spring.meeting.Boss">
        <property name="name" value="雷军"/>
        <property name="company" value="小米"/>
        <property name="car" ref="car3"/>
        <property name="hobbies">
            <list>
                <value>阅读</value>
                <value>运动</value>
            </list>
        </property>
    </bean>
  <bean id="meeting" class="com.spring.spring.meeting.Meeting">
        <property name="theme" value="未来"/>
        <property name="bosses">
            <list>
                <ref bean="boss1"/>
                <ref bean="boss2"/>
                <ref bean="boss3"/>
            </list>
        </property>
    </bean>
  • 主类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MeetingApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("/beans.xml");
        Meeting meeting = context.getBean(Meeting.class);
        System.out.println(meeting);
    }
  • 运行结果


    DI.png

相关文章

网友评论

      本文标题:IoC

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