Spring基于注解的自动装配
基于XML的自动装配是在配置文件的bean里设置autowire属性,有byType,byName的方式。而基于注解的自动装配同样是这样只不过我们直接在成员变量上直接标注@Autowired注解即可完成自动装配
@Autowired:实现用户自动装配功能的注解
1.@Autowired注解能够标识的位置
a>标识在成员变量上,此时不需要设置成员变量的set方法(最推荐使用)
b>标识在set方法上
c>标识在为当前成员变量赋值的有参构造上
2.@Autowired:注解的原理
a>默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值
b>若有多个类型匹配的bean,此时会自动转换为byName的方式实现自动装配的效果
c>若byType、byName的方式都无法实现自动装配,即IOC容器中有多个类型匹配的bean
且这些bean的id和要赋值的属性的属性名都不一致,此时会抛出异常
c.d>此时可以在成员变量上,添加一个@Qualifier
通过该注解的value属性值,指定某个bean的id,将这个bean为属性赋值
注意:若IOC容器中没有任何一个类型匹配的bean,此时会抛出异常:NoSuchBeanDefinitionException。在@Autowired注解中有一个属性required,默认值为true,要求必须完成自动装配。可以将required设置为false,此时能装配则装配,无法装配则使用默认值
以下为实现代码:
package com.qcw.spring.controller;
import com.qcw.spring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
@Autowired
private UserService userService;
public void saveUser(){
userService.saveUser();
}
}
package com.qcw.spring.service;
public interface UserService {
//保存用户信息
void saveUser();
}
package com.qcw.spring.service.impl;
import com.qcw.spring.dao.UserDao;
import com.qcw.spring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void saveUser() {
userDao.saveUser();
}
}
package com.qcw.spring.dao;
public interface UserDao {
//保存用户信息
void saveUser();
}
package com.qcw.spring.dao.impl;
import com.qcw.spring.dao.UserDao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
public void saveUser() {
System.out.println("保存成功");
}
}
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描组件-->
<context:component-scan base-package="com.qcw.spring"></context:component-scan>
</beans>
最后是测试方法:
package com.qcw.spring.test;
import com.qcw.spring.controller.UserController;
import com.qcw.spring.dao.UserDao;
import com.qcw.spring.service.UserService;
import com.qcw.spring.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IOCByAnnotationTest {
/**
* @Component:将类标识为普通组件
* @Controller:将类标识为控制层组件
* @Service:将类标识为业务层组件
* @Repository:将类标识为持久层组件
*
* 通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名的首字母为小写的结果
* 可以通过标识组件注解的value属性值自定义id
*
* @Autowired:实现用户自动装配功能的注解
* 1.@Autowired注解能够标识的位置
* a>标识在成员变量上,此时不需要设置成员变量的set方法
* b>标识在set方法上
* c>标识在为当前成员变量赋值的有参构造上
*
* 2.@Autowired:注解的原理
* a>默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值
* b>若有多个类型匹配的bean,此时会自动转换为byName的方式实现自动装配的效果
* c>若byType、byName的方式都无法实现自动装配,即IOC容器中有多个类型匹配的bean
* 且这些bean的id和要赋值的属性的属性名都不一致,此时会抛出异常
* c.d>此时可以在成员变量上,添加一个@Qualifier
* 通过该注解的value属性值,指定某个bean的id,将这个bean为属性赋值
*
* 注意:若IOC容器中没有任何一个类型匹配的bean,此时会抛出异常:NoSuchBeanDefinitionException
* 在@Autowired注解中有一个属性required,默认值为true,要求必须完成自动装配
* 可以将required设置为false,此时能装配则装配,无法装配则使用默认值
*/
@Test
public void test(){
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
UserController userController = ioc.getBean("userController",UserController.class);
System.out.println(userController);
// UserService userService = ioc.getBean(UserService.class);
// System.out.println(userService);
//
// UserDao userDao = ioc.getBean(UserDao.class);
// System.out.println(userDao);
userController.saveUser();
}
}