1.用注解的方式注册bean到ioc容器
有四个注解方式
@Controller:控制器,推荐给controller层添加此注解
@Service:业务逻辑,推荐给业务逻辑层添加此注解
@Repository:仓库管理,推荐给数据访问层添加此注解
@Component:给不属于以上基层的组件添加此注解
使用注解需要以下步骤:
1、添加上述四个注解中的任意一个
2、在xml中添加自动扫描类
<context:component-scan base-package="com.yang" > </context:component-scan>
注意:
1.组件的id默认就是组件的类名首字符小写,如果非要改名字的话,直接在注解中添加即可
2.组件默认情况下都是单例的,如果需要配置多例模式的话,可以在注解下添加@Scope注解
2.定义扫描包时要包含的类和不包含的类
在xml中添加自动扫描类时,可以添加不扫描的类
<context:component-scan base-package="com.yang"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
type:表示指定过滤的规则
annotation:按照注解进行排除,标注了指定注解的组件不要, expression表示要过滤的注解 assignable:指定排除某个具体的类,按照类排除,expression表示不注册的具体类名 aspectj:后面讲aop的时候说明要使用的aspectj表达式,不用
custom:定义一个typeFilter,自己写代码决定哪些类被过滤掉,不用
regex:使用正则表达式过滤,不用
添加扫描的类时,一般配合use-default-filters使用
use-default-filters 默认true, 会默认包含扫描@Controller @Service @Repository @Component
false,不会扫描@Controller @Service @Repository @Component
<context:component-scan base-package="com.yang" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
这样的话就是只扫描标记controller的类
3.自动注入
当使用AutoWired注解的时候,自动装配的时候是根据类型实现的。
1、如果只找到一个,则直接进行赋值。
2、如果没有找到,则直接抛出异常。
3、如果找到多个,那么会按照变量名作为id继续匹配。
1)匹配上直接进行装配
2)如果匹配不上则直接报异常
3)如果匹配多个有如下解决办法
@Qualifier注解来指定id的名称,让spring不要使用变量名;
可以修改bean名字对应的属性名字:@Service("userService");
可以通过@Primary,设置其中一个Bean为主要的自动注入Bean
通过泛型