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}
}
原文地址:https://www.cnblogs.com/chenyuan7/p/11947505.html