使用注解定义 Bean
Spring 提供了多个注解,这些注解可以直接标注在 Java 类上,将它们定义成 Spring Bean。
@Component:该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。
@Repository:该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
@Service:该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
@Controller :该注解通常作用在控制层(如 Struts2 的 Action、SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
基于注解方式实现依赖注入
我们通过注解将定义好 Bean 装配到其它的 Bean 中。
@Autowired :可以应用到 Bean 的属性变量、setter 方法、非 setter 方法及构造函数等,默认按照 Bean 的类型进行装配。@Autowired 注解默认按照 Bean 的类型进行装配,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置它的 required 属性为 false。如果我们想使用按照名称(byName)来装配,可以结合 @Qualifier 注解一起使用
@Resource: 作用与 Autowired 相同,区别在于 @Autowired 默认按照 Bean 类型装配,而 @Resource 默认按照 Bean 的名称进行装配。
@Resource 中有两个重要属性:name 和 type。
Spring 将 name 属性解析为 Bean 的实例名称,type 属性解析为 Bean 的实例类型。
如果指定 name 属性,则按实例名称进行装配;
如果指定 type 属性,则按 Bean 类型进行装配;
如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出NoSuchBeanDefinitionException 异常。
@Qualifier:与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。
@Service指定参数与不指定参数的细节问题
原理:@Service(“userService”) , 它里边的参数就是xml文件中的bean id=userService,如果不指定,相当于 bean id=com.mooc.service.impl.UserServiceImpl
一般情况我们采用@Service注解的时候,不用@Service(“userService”)指定的,因为默认是当前类的首字母小写,比如下边所示
//在UserServiceImpl类中
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findAll() {
System.out.println(userDao);
return userDao.findAll();
}
}
//在单元测试中,调用Service对象
@Test
public void Test(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService) context.getBean("userServiceImpl");
List<User> list=userService.findAll();
System.out.println(list);
}
我们也可以通过自定义参数来指定,@Service(“xxx”),注意观察参数变化
//在UserServiceImpl类中
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findAll() {
System.out.println(userDao);
return userDao.findAll();
}
}
//在单元测试中,调用Service对象
@Test
public void Test(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService) context.getBean("userService");
List<User> list=userService.findAll();
System.out.println(list);
}