自动装配就是指 Spring 容器在不使用
和
标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个 Bean 注入其他 Bean 的 Property 中。
下面使用IDEA 演示 Spring Bean 的自动装配:
import org.springframework.beans.factory.annotation.Autowired;
public class people {
private proxy proxy;
public proxy getProxy() {
return proxy;
}
public void setProxy(proxy proxy) {
this.proxy = proxy;
}
}
proxy类代码如下:
public class proxy {
public void buy(){
System.out.println("买了一套房子");
}
}
Test.java:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.people;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
people people = (people) context.getBean("people");
people.getProxy().buy();
}
}
配置文件bean.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="people" class="pojo.people" autowire="byName"/>
<bean id="proxy" class="pojo.proxy"/>
beans>
运行结果:
从这里看出,我们并没有对people类中proxy属性进行依赖注入,正常情况下应由
实现对proxy的依赖注入,而Autowired会在容器上下文中查找和自己对象set方法后面的值对应的bean id,实现自动装配
前景:在 Spring 中,尽管可以使用 XML 配置文件实现 Bean 的装配工作,但如果应用中 Bean 的数量较多,会导致 XML 配置文件过于臃肿,从而给维护和升级带来一定的困难。我们可以使用注解来配置依赖注入。
使用注解须知:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
beans>
Spring 中常用的注解如下。
@Resource 中有两个重要属性:name和type
下面使用IDEA展示Spring的注解配置:
UserDao代码如下:
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDao {
public void addUser(){
System.out.println("添加了一个用户数据");
}
}
UserService代码如下:
import dao.UserDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userService")
public class UserService {
@Resource(name="userDao")
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addMessage(){
userDao.addUser();
System.out.println("打印出添加用户数据的日志");
}
}
UserController代码如下:
import org.springframework.stereotype.Controller;
import service.UserService;
import javax.annotation.Resource;
@Controller("userController")
public class UserController {
@Resource(name="userService")
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void show(){
userService.addMessage();
System.out.println("成功添加该用户数据");
}
}
ApplicationContext.xml配置文件代码如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="pojo" />
<context:component-scan base-package="dao"/>
<context:component-scan base-package="service"/>
<context:component-scan base-package="controller"/>
<context:annotation-config/>
beans>
测试类代码:
import controller.UserController;
import pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserController uc = context.getBean("userController",UserController.class);
uc.show();
}
}
测试结果:
以上每个层的类都用其对应的注解装配Bean,注解后的name属性即对应xml文件中的bean id ,自动装配时按照bean的实例名称进行装配。
以上即为Spring注解的解析。