@Component是一个通用的注解,可用于任何bean
@Repository,@Service,@Controller是更有针对性的注解
@Repository:通常用于注解DAO类,即持久层
@Service:通常用于注解Service类,即服务层
@Controller:通常用于Controller类,机控制层(MVC)
元注解
许多Spring提供的注解,可以作为自己的代码,即"元数据注解",元注解是一个简单的注解,可以应用到另一个注解比如component,在使用元注解的时候除了value()外,元注解还可以允许有其他属性可以定制
- 类的自动检测与注册Bean
Spring可以自动检测所有类,并注册相应的Bean到ApplicationContext(IOC容器)中,
为了让spring能够检测到这些类并注册相应的Bean,需要下面的内容。
红线部分表示扫描定义的包下的所有类,并将其注册到IOC容器中。
如何使用过滤器进行自定义的扫描:
1、默认情况下, 类被自动发现并注册bean的条件是:使用@Component,@Repository,@Service,@Controller注解或者使用@Component的自定义注解。
2、可以通过过滤器修改上面的行为,如:下面的例子的XML配置忽略所有的@Repository注解并用”Stub“代替
3、还可以使用use-default-filters=”false “禁用自动发现与注册
- <context:annotation-config/>
基于XML的SPring配置的标签 ,(包含上下文命名空间)
<context:annotation-config/>仅会查找在同一个applicationContext中的Bean注解
定义bean:
1、扫描过程中组件被自动检测,那么bean名称是用BeanNameGenerator生成的(通常是类的名字的首字母小写) ,@Component,@Repository,@Service,@Controller都会有个name属性用于显示的设置BeanName
例子:
@Service("mySpringTest")这样在bean中的id就会是自己定义的名字,如果不写("mySpringTest")就会默认的类名的首字母小写。
2、这个自动命名可以自动修改规则(可以改成类名全体大写),实现的方法是BeanNameGenerator接口,并一定要包含的无参构造器,
覆盖好方法后要使用它需要在XML中引用该覆盖类。使用方法:
<bean>
<context:compontent-scan base-package="org.test" name-generator="org.example.自定义的命名类名"/>
</bean>
- @Component,@Repository,@Service,@Controller
- @Required
- @Autowired
1、可以将Autowired注解为"传统"的setter方法(可以注解到set方法上)
2、可用于构造器或者成员变量(可以注解到构造器或者成员变量上)
3、可以使用Autowired注解那些众所周知的解析依赖性接口
比如:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher,andMessageSource
- @Qualifier
当按类型自动装配时可能有多个Bean实例的情况下,可以使用Qualifier注解来缩小范围(或者指定唯一),也可以用于指定单独的构造器参数或者方法参数
例子1:用于成员变量
指定bean的id为main的bean进行自动注入
例子2:用于方法中
在xml中实现Qualifier
定义自己的qualifier注解并使用:
- @Resourse