zoukankan      html  css  js  c++  java
  • spring注入方式

    说出来挺丢人的,spring的一些内容又忘记了,总是百度挺麻烦的,从头开始学也挺麻烦的,所以碰到哪忘记了就写哪吧
     
    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入,还有P名称空间注入,spel注入
     
    构造方法注入:
    实体类Car,Person:
    public class Car {
        private String name;
        private String color;
    
        getter,setter,toString方法
    }
    public class Person {
        private int id;
        private String name;
        private String sex;
        private Car car;
    
    
        public Person(int id, String name, String sex, Car car) {
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.car = car;
        }
    
    
        toString方法
    }
    public class Person2 {
        private int id;
        private String name;
        private String sex;
        private Car car;
    
    
        getter,setter,toString方法
    }

    配置文件applicationContext.xml

    <bean name="car" class="com.example.springdemo.pojo.Car">
        <property name="name" value="雪佛兰"/>
        <property name="color" value="蓝色"/>
    </bean>
    
    
    <!-- 
    constructor-arg个数必须与构造方法参数的个数一致
    name:构造函数的参数名
    value:值
    ref:指向对应的对象bean
     -->
    
    
    <bean name="person1" class="com.example.springdemo.pojo.Person" autowire="constructor">
        <constructor-arg value="135"/>
        <constructor-arg value="小白constructor"/>
        <constructor-arg value="男"/>
        <constructor-arg ref="car"/>
    </bean>
     autowire="constructor" :通过构造方法自动注入,也可以(实体类的构造方法记得写)
    <!-- setter注入 -->
    <bean name="car2" class="com.example.springdemo.pojo.Car">
        <property name="name" value="法拉利"/>
        <property name="color" value="黑色"/>
    </bean>
    
    
    <bean name="person2" class="com.example.springdemo.pojo.Person2" autowire="byType">
        <property name="id" value="246" />
        <property name="name" value="小白byType"/>
        <property name="sex" value="男2"/>
        <property name="car" ref="car2"/>
    </bean>
     
     autowire="byType" :通过参数类型注入(实体类的getter,setter方法记得写)
    <!-- setter注入 -->
    <bean name="car3" class="com.example.springdemo.pojo.Car">
        <property name="name" value="兰博基尼"/>
        <property name="color">
            <value>白色</value>
        </property>
    </bean>

      <bean name="person3" class="com.example.springdemo.pojo.Person2" autowire="byName">
          <property name="id" value="789"/>
          <property name="name" value="小白byName"/>
          <property name="sex" value="男3"/>
          <property name="car" ref="car3"/>
      </bean>
    autowire="byName" :通过属性名注入(name值只与对应的set方法名有关,因此必须与set方法的后半截匹配)
    举个栗子:
    实体类person2:public void setId123(int id) {this.id = id;}
    配置文件:<property name="id123" value="789"/>
    测试类
    public class SpringTest{
        @Test
        public void stest13(){
            ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            Person person=(Person) context.getBean("person1");  //构造函数
            System.out.println(person);
            Person2 person2=(Person2) context.getBean("person2");   //byType
            System.out.println(person2);
            Person2 person3=(Person2) context.getBean("person3");   //byName
            System.out.println(person3);
        }
    }
    输出:
    P名称空间注入
    注意必须导入命名空间`xmlns:p="http://www.springframework.org/schema/p" `
    P名称空间注入本质就是set方法
     
    实体类测试类同上
     
    配置文件
     
    <bean name="car2" class="com.example.springdemo.pojo.Car">
        <property name="name" value="玛莎拉蒂"/>
        <property name="color" value="黑色"/>
    </bean>
    
    
    <bean name="person4" class="com.example.springdemo.pojo.Person" p:id="123" p:name="阿狸" p:car-ref="car2"/>
     
    spel注入
    取其他类型的值来当成自己的值:#{bean的名称.属性名}
    自定义:#{值}
    ref不能使用#{}的方式
    实体类测试类同上
    配置文件
     
    <bean name="car" class="com.example.springdemo.pojo.Car">
        <property name="name" value="法拉利"/>
        <property name="color" value="蓝色"/>
    </bean>
    
    
    <bean name="person5" class="com.example.springdemo.pojo.Person">
        <property name="id" value="#{person3.id}"/>
        <property name="name" value="#{person3.name}"/>
        <property name="car" ref="car"/>
    </bean>
    基于注解的注入
     
    扫描包注解:扫描指定包下的所有的类
    <context:component-scan base-package="com.example.springdemo.pojo"/>

    @Component:需要被spring管理的bean,没有具体的角色

    @Repository:标记Dao层

    @Service:标记Service层

    @Controller:标记Controller层

    举个栗子:

    实体类
    @Component("person6")
    public class Person {
        private int id;
        private String name;
        private Car car;
    
        getter,setter,toString方法
    }

    配置文件
    <context:component-scan base-package="com.example.springdemo.pojo"/>

    测试方法
     
    @Test
    public void stest17(){
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person=(Person) context.getBean("person6");
        System.out.println(person);
    }
    输出:
     
    Person{id=0, name='null', car=null}
    @Component("person6"):该注解的value属性用于指定该bean的id值,不加默认为类名+首字母小写
    复杂类型注入(数组,List,Map,Properties)

    Properties:该类主要用于读取Java的配置文件,以键值对的方式存储

    实体类
    public class Person3 {
        private Object[] obj;
        private Map map;
        private List list;
        private Properties properties;
    
    
        getter,setter,toString方法
    }
    配置文件
     
    <bean name="car2" class="com.example.springdemo.pojo.Car">
        <property name="name" value="法拉利"/>
        <property name="color" value="黑色"/>
    </bean>
    
    
    <bean name="car3" class="com.example.springdemo.pojo.Car">
        <property name="name" value="宝马"/>
        <property name="color">
            <!-- 使用< null/>元素:注入一个null值 -->
            <!--<null></null>-->
            <!--<value>null</value>-->
    
    
            <value>白色</value>
        </property>
    </bean>
    
    
    <bean name="person5" class="com.example.springdemo.pojo.Person3">
        <!-- 
            如果数组中只有一个值|对象可以直接使用 value=""|ref="" 的方式注入
            <property name="obj" value="小王"></property> 
    
    
            数组多个值注入
            value:属性方式注入
            ref:对象方式注入
         -->
        <property name="obj">
            <array>
                <value>哈哈哈</value>
                <value>嗷嗷嗷</value>
                <ref bean="car3"/>
            </array>
        </property>
    
    
        <!-- 
            list集合多个值注入
            value:属性方式注入
            ref:对象方式注入
         -->
        <property name="list">
            <list>
                <value>嘻嘻嘻</value>
                <value>呀呀呀</value>
                <ref bean="car2"/>
            </list>
        </property>
    
    
        <!-- 
            map集合多个值注入
            value:属性方式注入
            key-ref|value-ref:对象方式注入
         -->
        <property name="map">
            <map>
                <entry key="key01" value="小狼"/>
                <entry key="key02" value="小樱"/>
                <entry key="key03" value-ref="car3"/>
                <entry key-ref="car2" value="car2对象"/>
                <entry key-ref="car3" value="car3对象"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="driverClass">com.jdbc.mysql.driver</prop>
            </props>
        </property>
    </bean>
    输出:
    Person3{
        obj=[哈哈哈, 嗷嗷嗷, Car{name='宝马', color='白色'}], 
        map={key01=小狼, key02=小樱, key03=Car{name='宝马', color='白色'}, 
        Car{name='法拉利', color='黑色'}=car2对象, 
        Car{name='宝马', color='白色'}=car3对象}, 
        list=[嘻嘻嘻, 啊啊啊, Car{name='法拉利', color='黑色'}], 
        properties={driverClass=com.jdbc.mysql.driver, username=root}
    }
  • 相关阅读:
    java设计模式概述
    Filter
    hello1 hello2 代码分析
    计划
    页面生命周期1
    Jquery
    关于DropDownList
    页面生命周期
    随机生成验证码
    关于技术
  • 原文地址:https://www.cnblogs.com/chenyuan7/p/11947505.html
Copyright © 2011-2022 走看看