1.常用的注解
- @Component
- 标识一个普通组件(常用于class文件)
- @Repository
- 标识一个持久层(数据访问层)组件(常用于dao文件)
- @Service
- 标识一个业务逻辑层组件(常用于service文件)
- @Controller
- 标识一个表现层的组件(常用于handler处理器)
- 如果某些类需要让IOC容器来管理,处理添加以上标识之外,还需要在Spring的配置文件中设置自动扫描的包
<!-- 配置自动扫描的包 -->
<
context:component-scan
base-package
=
"com.atguigu.spring.t"
></
context:component-scan
>
- 通过注解的方式让IOC容器实例化bean时,在IOC容器中bean的id属性值默认是类的类名的首字母小写,我们也可以通过value属性来指定该id属性值,如:@Repository(value="userDao")或@Repository("userDao"),value属性值可以省略。
- 此时IOC容器中bean实例的id属性值就是userDao
- 指定扫描那些类
- 此时需要设置<context:component-scan>标签中的use-default-filters属性值为false
<!-- 配置自动扫描的包 -->
<!-- base-package:指定一个基础包,Spring会自动扫描该包及其子包中的所有类 -->
<!-- resource-pattern:精确指定扫描那个包下的类 -->
<!-- <context:component-scan base-package="com.atguigu.spring.annotation" resource-pattern="
dao
/
impl
/*.class"></context:component-scan> -->
<
context:component-scan
base-package
=
"com.atguigu.spring.annotation"
use-default-filters
=
"false"
>
<!-- ★指定只扫描那些类:使用context:include-filter子标签 -->
<!--
指定只扫描那些类必须将use-default-filters的属性值设置为false
-->
<!--
type属性的值:
-annotation:expression值是注解的全类名
-assignable:expression值是要扫描的类的全类名或者是其实现的接口的全类名
-->
<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
<
context:include-filter
type
=
"assignable"
expression
=
"com.atguigu.spring.annotation.dao.UserDao"
/>
</
context:component-scan
>
- 指定不扫描那些类
<
context:component-scan
base-package
=
"com.atguigu.spring.annotation"
>
<!-- ★指定只扫描那些类:使用context:include-filter子标签 -->
<!-- 指定只扫描那些类必须将use-default-filters的属性值设置为false -->
<!--
type属性的值:
-annotation:expression值是注解的全类名
-assignable:expression值是要扫描的类的全类名或者是其实现的接口的全类名
-->
<!-- ★指定不扫描那些类:使用context:exclude-filter子标签 -->
<!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
<
context:exclude-filter
type
=
"assignable"
expression
=
"com.atguigu.spring.annotation.dao.UserDao"
/>
</
context:component-scan
>
- @Autowired
- 用来自动转配类中的属性,默认是必须要装配成功,如果无法装配成功会抛出异常,我们也可以通过设置required=false来指定某个属性不是必须要装配的
/**
* 自动装配的步骤:
* 1.根据属性的类型自动装配
* 2.
以属性名作为id属性值去IOC容器中查找
* 3.
可以通过@Qualifier注解来指定要装配IOC容器中的那个bean实例
*/
@Autowired
// @Qualifier(value="userDao2")
@Qualifier
(
"userDao2"
)
//通过@Qualifier注解中的value属性指定要装配的bean的id属性值,value属性可以省略
private
UserDao
userDao
;
//也可以通过以下方式实现自动装配(不常用)
// @Autowired
// public void setUserDao(@Qualifier("userDao1") UserDao userDao) {
// this.userDao = userDao;
// }
@Autowired
(
required=
false
)
//通过设置required=false来告诉Spring
该属性不是必须要装配的
private
User
user
;
2.泛型依赖注入(Spring4.0的新特性)
- 分别创建BaseDao<T>和BaseService<T>,在BaserService<T>中注入BaseDao<T>
@Service
public
class
BaseService<T> {
@Autowired
protected
BaseDao<T>
baseDao
;
public
void
testBaseDao(){
System.
out
.println(
baseDao
.getClass());
}
}
- 分别创建UserDao继承BaseDao<User>;UserService继承BaseService<User>
@Repository
public
class
UserDao
extends
BaseDao<User> {
}
@Service
public
class
UserService
extends
BaseService<User> {
}
- 测试
- 从IOC容器中获取UserService实例,然后调用BaseService中的testBaseDao方法,然后发现注入的baseDao是UserDao
@Test
public
void
testT(){
UserService
userService
= (UserService)
ioc
.getBean(
"userService"
);
userService
.testBaseDao();
}
3.整合多个配置文件
- 1)使用通配符
//整个多个配置文件的方式:
//1)使用通配符*
ApplicationContext
ioc
=
new
ClassPathXmlApplicationContext(
"beans-*.xml"
);
- 2)直接在创建IOC容器时传入多个配置文件
//2)直接传入多个配置文件
ApplicationContext
ioc
=
new
ClassPathXmlApplicationContext(
"beans-annotation.xml"
,
"beans-xml.xml"
,
"beans-t.xml"
);
- 3)找一个主配置文件,然后将其他的配置文件通过import标签引入进来
//3)选中一个配置文件作为主文件,然后同import标签将其他文件导入进来
ApplicationContext
ioc
=
new
ClassPathXmlApplicationContext(
"beans-annotation.xml"
);
- 导入其他配置文件
<!-- 导入其他配置文件 -->
<
import
resource
=
"beans-t.xml"
/>
<
import
resource
=
"beans-xml.xml"
/>