一、装配:Spring在Bean与Bean之间建立依赖关系的行为。
有3种方式:
- 手动维护:在<constructor-arg>或者<property>标签种通过ref属性进行装配。
<bean id="dept" class="org.caoze.autoWired.Dept"> <property name="deptNo" value="1"></property> <property name="deptName" value="技术部"></property> </bean>--> <bean id="employee" class="org.caoze.autoWired.Employee"> <property name="empNo" value="002"></property> <property name="empName" value="小曹"></property> <!--通过ref="dept"将"dept"与"employee"进行关联,这样就可以在类employee中使用类dept了,并且 可以直接将dept定义的属性注入到employee中了。--> <property name="dept" ref="dept"></property> </bean>
- 通过autowire自动装配:
byName | 按名称自动装配。Spring会根据Java类中对象属性的名称,在整个应用的上下文ApplicationContext(Ioc容器)中查找,若某个Bean的id或name属性值与这个对象属性名称相同,则获取这个Bean,并与当前的Java类Bean建立关联。 |
byType | 按类型自动装配。Spring 会根据 Java 类中的对象属性的类型,在整个应用的上下文 ApplicationContext(IoC 容器)中查找。若某个 Bean 的 class 属性值与这个对象属性的类型相匹配,则获取这个 Bean,并与当前的 Java 类的 Bean 建立关联关系。 |
constructor | 与buType模式相似,不同之处在于他应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的Bean,那么将抛出异常。 其实就是根据构造器参数的数据类型,进行byType模式的自动装配。 |
default | 表示默认采用上一级元素<beans>设置的自动装配规则装配。 |
no | 默认值表示不使用自动装配。 |
<!--按名称自动装配,xml中bean的id或name必须与类中的属性名相同,即在类employee中必须有一个属性
名为dept-->
<bean id="dept" class="org.caoze.autoWired.Dept">
<property name="deptNo" value="1"></property>
<property name="deptName" value="技术部"></property>
</bean>
<bean id="employee" class="org.caoze.autoWired.Employee" autowire="byName">
<property name="empNo" value="002"></property>
<property name="empName" value="小张"></property>
</bean>
<!--根据构造函数自动装配,两个类的属性注入使用的就是构造函数注入,然后再将类dept装配进类
employee中-->
<bean id="dept" class="org.caoze.autoWired.Dept">
<constructor-arg name="deptNo" value="1"></constructor-arg>
<constructor-arg name="deptName" value="技术部"></constructor-arg>
</bean>
<bean id="employee" class="org.caoze.autoWired.Employee" autowire="constructor">
<constructor-arg name="empNo" value="002"></constructor-arg>
<constructor-arg name="empName" value="小张"></constructor-arg>
</bean>
- 通过注解自动装配
1、新建如下所示的文件目录结构
2、首先在Beans.xml中开启组件扫描功能
<context:component-scan base-package="org.caoze"></context:component-scan>
3、新建接口UserDao.java
package org.caoze.Dao;
public interface UserDao {
public void print();
}
4、新建接口UserDao的实现类UserDaoImpl.java
package org.caoze.Dao.impl;
import org.caoze.Dao.UserDao;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
//@Repository将数据访问层的类标识为Spring中的bean
// @Repository("UserDao")
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void print() {
System.out.println("first");
}
}
5、新建接口UserService.java
package org.caoze.service;
public interface UserService {
public void out();
}
6、新建接口UserService的实现类UserServiceImpl.java
import org.caoze.Dao.UserDao;
import org.caoze.Dao.impl.UserDaoImpl;
import org.caoze.service.UserService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
//@Service:将业务层(service)的类标识为Spring中的bean
// @Service("userService")
@Component("userService")
public class UserServiceImpl implements UserService {
//@Resource:默认按照Bean的名称装配(装配:spring在bean与bean之间建立依赖关系的行为)
@Resource(name = "userDao")
private UserDao userDao;
//这是不使用spring来创建实例,即通过类来新建对象。
// UserDao userDao = new UserDaoImpl();
public UserDao getUserDao(){
return userDao;
}
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void out(){
userDao.print();
System.out.println("second");
}
}
7、新建UserController.java
import org.caoze.service.UserService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
//@Controller:将控制层(controller)的类表识为spring中的bean
// @Controller("userController")
@Component("userController")
public class UserController {
@Resource
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public UserService getUserService() {
return userService;
}
public void doStr(){
userService.out();
System.out.println("third");
}
}
8、新建测试文件MainApp.java
import org.caoze.controller.UserController;
import org.caoze.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
UserController obj = context.getBean("userController",UserController.class);
obj.doStr();
}
}
9、运行MainApp.java,控制台打印出以下内容: