Required 不常用
- Required注解适用于bean属性的setter方法
- 这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值
- Required 这整个应用中并不常用
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Required
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
Autowired 常用
- 可以将@Autowired注解为“传统”的setter方法
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
public class SimpleMovieLister {
@Autowired
private MovieFinder movieFinder;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public SimpleMovieLister(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
}
- 默认情况下,如果因找不到合适的bean将会导致autowiring失败抛出异常,可以通过required = false方式避免
public class SimpleMovieLister {
private MovieFinder movieFinder;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired(required = false)
public SimpleMovieLister(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
}
- 每个类只能有一个构造器被标记为required=true
- @Autowired的必要属性,建议使用@Required注解
例子:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190825214204953.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RvcmV5X0xp,size_16,color_FFFFFF,t_70)
package com.torey.beanannotation.injection.dao;
public interface InjectionDao {
public void save(String arg);
}
package com.torey.beanannotation.injection.dao;
import org.springframework.stereotype.Repository;
@Repository
public class InjectionDaoImpl implements InjectionDao {
public void save(String arg){
System.out.println("模拟数据添加:" + arg);
}
}
package com.torey.beanannotation.injection.service;
import org.springframework.util.StringUtils;
public interface InjectionService {
void save(String arg);
}
package com.torey.beanannotation.injection.service;
import com.torey.beanannotation.injection.dao.InjectionDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class InjectionServiceImpl implements InjectionService {
private InjectionDao injectionDao;
@Autowired
public InjectionServiceImpl(InjectionDao injectionDao) {
this.injectionDao = injectionDao;
}
public void setInjectionDao(InjectionDao injectionDao) {
this.injectionDao = injectionDao;
}
@Override
public void save(String arg) {
System.out.println("Service接收的参数为:" + arg);
arg=arg+":"+this.hashCode();
injectionDao.save(arg);
}
}
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.torey.beanannotation"/>
</beans>
package com.torey.springtest.base;
import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;
public class UnitTestBase {
public UnitTestBase(){}
private String springXmlPath;
private ClassPathXmlApplicationContext applicationContext;
public UnitTestBase(String springXmlpath){
this.springXmlPath=springXmlpath;
}
@Before
public void before(){
if (StringUtils.isEmpty(springXmlPath)) {
springXmlPath="classpath*:spring-*.xml";
}
applicationContext= new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]"));
applicationContext.start();
}
@After
public void after(){
applicationContext.destroy();
}
public Object getBean(String beanId){
return applicationContext.getBean(beanId);
}
}
package com.torey.springtest.bean;
import com.torey.beanannotation.BeanAnnotation;
import com.torey.beanannotation.injection.service.InjectionService;
import com.torey.springtest.base.UnitTestBase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import java.io.IOException;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestBeanAnnotation extends UnitTestBase {
public TestBeanAnnotation(){
super("classpath:spring-beanannotation.xml");
}
@Test
public void testAutowired(){
InjectionService inje= (InjectionService)super.getBean("injectionServiceImpl");
inje.save("this is testAutowired");
}
}
根据慕课网 moocer老师的spring课程 整理