zoukankan      html  css  js  c++  java
  • Spring 依赖注入(一、注入方式)

    Spring是一个依赖注入(控制反转)的框架,那么依赖注入(标控制反转)表现在那些地方了?

    即:一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的时候给予注入。

    注入有2种方式:

    1. 属性注入:通过无参构造函数+setter方法注入

    2. 构造注入:通过有参的构造函数注入。

    优缺点:

    1. 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造函数会显得类很臃肿。

    2. 构造注入是一种高内聚的体现,特别是针对有些属性需要在对象在创建时候赋值,且后续不允许修改(不提供setter方法)。

    下面看一个实例:

    1.新建一个接口IPet

    package entities;
    
    public interface IPet {
        public String getName();
        public void setName(String name);
        public void sleep();
    }

    2.新建两个类Dog和Cat

    package entities;
    
    public class Cat implements IPet{
        
        //程序运行时,Cat的属性会被xml文件的属性注入代替
        private String name = "kitty";
        private int age = 2;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public void sleep() {
            System.out.println(name + "小猫睡了");        
        }    
    }
    package entities;
    
    public class Dog implements IPet{
        public String name;
        public int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        //构造方法重载
        public Dog(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public void sleep() {
            System.out.println(name + "小狗睡了");
        }
    }

    3.配置beans.xml文件

    <?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">
        
        <!--指向Cat类,调用时直接用id的值-->
       <bean id="pet1" class="entities.Cat">
            <!--属性注入-->
            <property name="name" value="tom"></property>
            <property name="age" value="3"></property>
        </bean>
    
      <bean id="pet2" class="entities.Dog">
            <!-- 构造方法注入 -->
            <constructor-arg name="name" value="An"></constructor-arg>
            <constructor-arg name="age" value="4"></constructor-arg>
        </bean>
       
    </beans>

    4.读取配置文件并运行

    package entities;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args) {
            //加载配置文件
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");    
    
         //读取xml文件中Cat和Dog对应的id
            IPet pet1 = (IPet)context.getBean("pet1");
            IPet pet2 = (IPet)context.getBean("pet2");
    
            pet1.sleep();
            pet2.sleep();
        }
    }

    运行结果:

    <!--Cat类中的属性被xml文件的属性代替-->
    tom小猫睡了
    <!--读取xml文件的构造方法注入,通过Dog类中的构造函数给属性赋值--> an小狗睡了
  • 相关阅读:
    机器学习之逻辑回归
    机器学习之线性回归与模型保存
    机器学习之决策树
    机器学习之贝叶斯算法
    机器学习之KNN算法
    算法基础与开发流程
    特征选择与特征降维
    特征预处理
    RSA加密算法和签名算法
    Java中使用OpenSSL生成的RSA公私钥
  • 原文地址:https://www.cnblogs.com/hq233/p/6664731.html
Copyright © 2011-2022 走看看