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} }