Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:
(1)setter注入
(2)构造方法注入
(3)基于注解的注入
setter注入
//set注入后程序不在具有主动性,而变为被动接受对象 控制反转 IOC原型 主动权在用户
private UserDao userDao;
//利用set动态实现值得注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
beans.xml
<bean id="userServiceImpl" class="com.wu.service.UserServiceImpl">
<!--
ref是引用spring容器中创建好的对象
value是具体的值 基本类型
ref可以换成 mysqlImpl/oracleImpl
-->
<property name="userDao" ref="impl"/>
</bean>
构造器注入
@Data
public class User {
private String name;
public User() {
System.out.println("User无参构造");
}
public User(String name) {
this.name = name;
System.out.println("User有参构造");
}
public void show() {
System.out.println("name = " + name);
}
}
beans.xml
<bean id="user" class="com.wu.pojo.User" name="user3 user4,user5;user6" p:name="小明" scope="prototype">
<!-- <property name="name" value="小明"/>User无参构造 默认-->
<!-- User有参构造-->
<!-- <constructor-arg index="0" value="小红"/> 方式一 下标赋值-->
<!-- <constructor-arg type="java.lang.String" value="小红2"/> 方式二 不建议使用-->
<constructor-arg name="name" value="小红3"/><!-- 方式三 参数名-->
</bean>
注解注入
@Data
public class Person {
//按类型装配(默认使用的装配方式)。 byType class唯一
//按名称装配(结合@Qualifier注解使用)。 byName id唯一
//自动注解
@Autowired//byType class
private Cat cat;
@Autowired//组合byName id
@Qualifier(value = "dog")
//@Resource 先name 后type id名字唯一 class全局唯一 既没指定name,也没指定type,自动按照名称装配 byName(id) name:指定需注入的bean的名称(id) type: 指定需注入的bean的类型(class)
private Dog dog;
private String name;
}