Setter注入
package com.hhh.service.impl;
import com.hhh.dao.UserDAO;
import com.hhh.service.UserService;
/**
* @Author: hehehe
* @Date: 2022/4/15 15:53
*/
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserServiceImpl(){
}
//setter注入
public void setUserDAO(UserDAO userDAO){
this.userDAO = userDAO;
}
@Override
public void save() {
userDAO.save();
System.out.println("UserServiceImpl.save");
}
}
<?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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
DI 依赖注入
UserDAO userDAO = new UserDAOImpl();
UserService userService = new UserServiceImpl();
这时需要通过setter或者构造器注入
1、setter注入
-->
<bean id="userDAO" class="com.hhh.dao.impl.UserDAOImpl"></bean>
<bean id="userService" class="com.hhh.service.impl.UserServiceImpl">
<!-- 调用UserServiceImpl中的setUserDAO方法 -->
<property name="userDAO" ref="userDAO"></property>
</bean>
</beans>
构造器注入
package com.hhh.service.impl;
import com.hhh.dao.UserDAO;
import com.hhh.service.UserService;
/**
* @Author: hehehe
* @Date: 2022/4/15 15:53
*/
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserServiceImpl(UserDAO userDAO){
this.userDAO = userDAO;
}
@Override
public void save() {
userDAO.save();
System.out.println("UserServiceImpl.save");
}
}
<?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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
2、构造器注入
-->
<bean id="userDAO2" class="com.hhh.dao.impl.UserDAOImpl"></bean>
<bean id="userService2" class="com.hhh.service.impl.UserServiceImpl">
<!-- 调用UserServiceImpl中的有参构造器 -->
<constructor-arg name="userDAO" ref="userDAO2"></constructor-arg>
</bean>
</beans>
命名空间
<?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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
命名空间注入
本质还是setter和构造器注入,只是换了种方式
-->
<bean id="userDAO3" class="com.hhh.dao.impl.UserDAOImpl"></bean>
<bean id="userService3" class="com.hhh.service.impl.UserServiceImpl" c:userDAO-ref="userDAO3" p:userDAO-ref="userDAO3"></bean>
</beans>
基于注解的注入
@Autowired(自动注入)修饰符有三个属性:Constructor,byType,byName。默认按照byType注入。
constructor:通过构造方法进行自动注入,spring会匹配与构造方法参数类型一致的bean进行注入,如果有一个多参数的构造方法,一个只有一个参数的构造方法,在容器中查找到多个匹配多参数构造方法的bean,那么spring会优先将bean注入到多参数的构造方法中。
byName:被注入bean的id名必须与set方法后半截匹配,并且id名称的第一个单词首字母必须小写,这一点与手动set注入有点不同。
byType:查找所有的set方法,将符合符合参数类型的bean注入。
主要有四种注解可以注册bean,每种注解可以任意使用,只是语义上有所差异:
@Component:可以用于注册所有bean
@Repository:主要用于注册dao层的bean
@Controller:主要用于注册控制层的bean
@Service:主要用于注册服务层的bean
<?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"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
自动装配
byName 按照名字装配,要求bean的id于servcie中声明的对象一致
byType 按照类型装配,要求容器中该类型只能有一个实例
-->
<bean id="userDAO" class="com.hhh.dao.impl.UserDAOImpl"></bean>
<bean id="userService" class="com.hhh.service.impl.UserServiceImpl" autowire="byName"></bean>
</beans>