目录
- 第一节 Spring依赖注入Bean属性(xml)
- 1.1 手动装配,使用xml配置
- 1. 通过构造方法注入
- 2. 通过属性的setter方法注入
- 3. 通过p命名空间注入【了解】
- 1.2 SpEL表达式【了解】
- 演示
- 1.3 集合注入
- List、Set、Map、Properties、数组
- 1.4 注解注入
- @Component使用案例
- @Component("id")使用案例
- 未使用注解的web-service-dao配置
- 使用注解的web-service-dao配置
第一节 Spring依赖注入Bean属性(xml)
1.1 手动装配,使用xml配置
1. 通过构造方法注入
- 写一个Student类,提供get/set、toString、无参构造、2种不同的有参构造
- 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">
<!--通过构造方法注入属性的值-->
<!--<bean class="com.it.model.Student" id="student">
<!–这样写就调用的是2个string的构造方法–>
<constructor-arg name="username" value="shu"></constructor-arg>
<constructor-arg name="password" value="123"></constructor-arg>
</bean>-->
<!--<bean class="com.it.model.Student" id="student">
<!–这样写就调用的是一个string 一个是int 的构造方法–>
<constructor-arg name="username" value="shu"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>-->
<bean class="com.it.model.Student" id="student">
<!--还可以通过索引加类型,给构造方法赋值-->
<constructor-arg index="0" value="shu" type="java.lang.String"></constructor-arg>
<constructor-arg index="1" value="18" type="int"></constructor-arg>
</bean>
</beans>
- 效果
2. 通过属性的setter方法注入
- setter方法有两种注入,一般使用第一种直观
- beans1.xml
- 效果
3. 通过p命名空间注入【了解】
- 使用这种方法的类,必须要给属性提供get/set方法,否则报错
- beans2.xml
- 效果
1.2 SpEL表达式【了解】
- SpEL:Spring 表达式
- 对<property>进行统一编程,所有的内容都使用value。
- <property name="" value="#{表达式}">
#{123}、#{‘jack’} : 数字、字符串
#{beanId} :另一个bean引用
#{beanId.propName} :操作数据
#{beanId.toString()} :执行方法
#{T(类).字段|方法} :静态方法或字段
演示
- 提供Address属性的get/set方法、重写toString
- 提供Customer属性的get/set方法、重写toString(toString无需包含地址)
- beans3.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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--SpEL:spring表达式
<property name="" value="#{表达式}">
#{123}、#{'jack'} : 数字、字符串
#{beanId} :另一个bean引用
#{beanId.propName} :操作数据
#{beanId.toString()} :执行方法
#{T(类).字段|方法} :静态方法或字段
-->
<!--创建一个地址对象-->
<bean class="com.it.model.Address" id="address">
<property name="name" value="北京"></property>
</bean>
<bean class="com.it.model.Customer" id="customer">
<!--<property name="name" value="shu"></property>-->
<!--这样写的好处是能调用方法-->
<property name="name" value="#{'shu'.toUpperCase()}"></property>
<!--还可以将address.name 地址名赋值给客户名(操作数据的一种写法)-->
<!--<property name="name" value="#{address.name}"></property>-->
<!--<property name="pi" value="3.14"></property>-->
<!--调用静态方法 Math.PI-->
<property name="pi" value="#{T(java.lang.Math).PI}"></property>
<!--一个对象引用另外一个对象的两种写法:-->
<!--1.ref引用-->
<!--<property name="address" ref="address"></property>-->
<!--2.使用spel 在Customer中引用了另外一个(Address)bean-->
<property name="address" value="#{address}"></property>
</bean>
</beans>
- 效果
1.3 集合注入
- 集合的注入都是给<property>添加子标签
- 数组:<array>
List:<list>
Set:<set>
Map:<map> ,map存放k/v 键值对,使用<entry>描述
Properties:<props> <prop key=" "></prop> </props> - 普通数据:<value>
- 引用数据:<ref>
List、Set、Map、Properties、数组
- 写个Programmer程序员类,提供以下集合与数组的get/set方法
- beans4.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">
<!--通过bean集合注入-->
<bean class="com.it.model.Programmer" id="programmer">
<property name="cars">
<!--list集合的注入-->
<list>
<value>奔驰</value>
<value>宝马</value>
<value>ofo</value>
</list>
</property>
<property name="pats">
<!--set集合的注入-->
<set>
<value>大黄</value>
<value>哈士奇</value>
<value>蓝猫</value>
</set>
</property>
<property name="infos">
<!--map集合的注入-->
<map>
<entry key="name" value="shu"></entry>
<entry key="password" value="123"></entry>
<entry key="age" value="18"></entry>
</map>
</property>
<property name="mysqlInfos">
<!--properties的注入-->
<props>
<prop key="url">mysql:jdbc://localhost:3306/spring_day02</prop>
<prop key="username">root</prop>
<prop key="password">root</prop>
</props>
</property>
<property name="members">
<!--数组注入-->
<array>
<value>father</value>
<value>mother</value>
<value>sister</value>
</array>
</property>
</bean>
</beans>
- 效果
1.4 注解注入
- 注解:就是一个类使用@注解名称
开发中:使用注解 取代 xml配置文件
@Component使用案例
- @component取代:<bean class="">
- 在UserServiceImpl上添加一个@Component
- beans5.xml配置,使用这种方法需要开启注解和配置注解扫描的位置
- 使用与效果(成功注入值)
@Component(“id”)使用案例
- @Component(“id”)取代: <bean id="" class="">
- 在UserServiceImpl上添加一个@Component(“userService”)
- beans5.xml配置同上,开启注解和配置注解位置即可
- 使用与效果(值同样注入成功)
未使用注解的web-service-dao配置
- dao实现类(简单的使用,暂不使用数据库)
- service实现类(userDao通过spring赋值)
- web-action的使用(userService通过spring赋值)
- beans6.xml配置
- 使用与效果
使用注解的web-service-dao配置
- web开发,提供3个@Component注解衍生注解(功能一样)取代<bean class="">
@Repository(“名称”):dao层
@Service(“名称”):service层
@Controller(“名称”):web层
@Autowired:自动根据类型注入
@Qualifier(“名称”):指定自动注入的id名称
@Resource(name=“名称”):@Autowired与@Qualifier(“名称”)的结合
@Scope(“prototype”):多例,默认是单列singleton
@ PostConstruct 自定义初始化
@ PreDestroy 自定义销毁
- 在dao实现类上使用@Repository注解
- 在service实现类上使用@Service注解,在userDao上使用@Autowired自动根据类型注入
- 在UserAction上使用@Controller注解,表示web层
- beans7.xml配置,只需开启注解与配置扫描注解即可
- 效果相同,使用方便、快捷
- @Qualifier(“名称”)的使用(指定自动注入的id名称)
UserAction中:
UserServiceImpl中: - @Resource(name=“名称”)的使用
- @Scope(“prototype”)(多例,默认是单列singleton)的使用
不配置,默认是单列的,从spring容器中获取UserAction类的对象,是同一个
配置后,是多例的,每次获取都会返回一个新的对象
相当于之前在beans.xml中配置的单列、多例 - @ PostConstruct 自定义初始化与@ PreDestroy 自定义销毁的使用
在UserDao的实现类中配置:
注意要使用context调用关闭容器close的方法,才会执行自定义销毁方法