一、手动装配,使用XML配置
1.构造方法注入
实体类:Stuent
public class Student {
private String username;
private String password;
private int age;
public Student() {}
public Student(String username, String password, int age) {
this.username = username;
this.password = password;
this.age = age;
}
public Student(String username,String password) {
this.username = username;
this.password = password;
}
public Student(String username,int age) {
this.username = username;
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [username=" + username + ", password=" + password + ", age=" + age + "]";
}
}
applicationContext.xml 构造方法注入方式
类似于调用了 public Student(String username.string password);构造函数
<beans>
<!--第一种为属性值进行赋值-->
<bean id="stu1" class="com.lq.pojo.Student">
<constructor-arg name="username" value="zhangsan"></constructor-arg>
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
<!--第二种为索引值进行赋值-->
<bean id="stu2" class="com.lq.pojo.Student">
<constructor-age index="0" value="lq" type="java.lang.String">
<constructor-age index="1" value="5" type="int">
</bean>
</beans>
注意:这里有一点很重要,如果你类中age类型是int 那么在xml type中写int 如果你使用的是包装类Integer的话 就写java.lang.Integer
2.属性setter属性方法注入 (前提是实体类中有get/set)
<!-- 通过setter属性方法注入 -->
<bean id="stu" class="com.lq.pojo.Student">
<property name="username" value="lq"></property>
<property name="password" value="123456"></property>
<property name="age" value="18"></property>
</bean>
2.1通过p命名空间进行属性setter方法注入 首先导入约束 红色箭头的那个
<!-- 通过p命名空间进行setter属性注入 -->
<bean id="stu2" class="com.lq.pojo.Student" p:username="lq" p:password="123" p:age="19"></bean>
3.SpEL表达式(Spring表达式)
<!--
SpEl表达式:Spring表达式
<property name="" value="#{表达式}">
#{123}、#{'jack'} ---数字、字符串
#{beanId} ---另一个bean引用
#{beanId.propName} ---操作数据
#{beanId.toString()} ---执行方法
#{T(类).字段{方法} ---静态方法或字段
-->
这个时候 我们加了一个字符串变大写的方法 惊奇的发现 竟然成大写了。这就是SqEl表达式好处 能够调用方法
还可以使用SpEL调用类方法(这里我们调用Math下的一个PI)
一个对象引用另一个对象(有两种方法)
1.使用ref <property name="address" ref="address"></property>
2.使用SpEL表达式 <property name="address" ref="#{address}"></property>
引用对象还可以使用SpEL表达式 效果一致
3.集合注入
集合的注入都是给<property>添加子标签
- 数组:<array>
- List:<list>
- Set:<set>
- Map:<map> map存放k/v键值对 使用<entry>描述
- Properties: <props> <prop key=""></prop>
普通数据: <value> 引用数据:<ref>
3.1 使用List集合
将其改成set集合后(我们发现利用了set集合的特性 过滤掉了重复的数据)
将其改成map集合后(键值对数据)
将其改成Properties后
4.接口注入(这种注入方式在整合MyBaits时候用的非常多)
xml
讲到这里 基本就完结了。还有个<array>的 其实它跟集合那个xml写法是一样的 就是把标签改一下而已。
注入的方式有:
- 属性(setter)方法注入
- 构造器注入
- 接口注入
- 静态工厂方法注入
- 实体工厂方法注入
- 注解实现注入(整合后期经常使用)
可能大家有些刚学Spring的不知道这些注入以后有什么用,只觉得更加复杂了,或者 压根没实际作用,其实到了后面SSM整合项目的时候,你会发现 这些用的非常多的,没有一个是用不到的,都会用到,要记住一句话,研究出来的技术总有用处和它的好处,不然别人研究出来干嘛呢,一些没用的东西,他们会去废除,弃用,但是如果一些技术没有被弃用 说明它的用处还是很大的,我们首先要掌握它的基本用法,并且经常去练习,现在迷茫,等到你项目以后用到的时候,你就会恍然大悟了 ,原来这个东西作用是这样的。
下一篇将讲解自动注入,注解的方式:注解注入