一、Spring 在classpath下自动扫描组件
示例:
1.com.spring.beans.annotation.controller包下的 UserController类
package com.spring.beans.annotation.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.spring.beans.annotation.service.UserService;
@Controller
public class UserController {
//Spring 将 自动装配 名为 userService 的bean
@Autowired
private UserService userService123;
public void exec() {
System.out.println("UserController exec...");
userService123.add();
}
}
2.com.spring.beans.annotation.service包下的UserService类
package com.spring.beans.annotation.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.spring.beans.annotation.repository.UserRepository;
@Service
public class UserService {
@Autowired(required=false) //IOC容器中没有该类型实例时,可以不装配
@Qualifier("userRepository") //有多个该类型的bean时,指定装配哪一个
private UserRepository userRepository;
//@Autowired 也可注解在set方法上
//@Qualifier("userRepository") 也可写在入参的前边
// public void setUserRepository(UserRepository userRepository) {
// this.userRepository = userRepository;
// }
//@Autowired
//@Qualifier("userRepository")也可不写在方法上,写在入参的前边
// public void setUserRepository(@Qualifier("userRepository")UserRepository userRepository) {
// this.userRepository = userRepository;
// }
public void add(){
System.out.println("UserSevice add...");
userRepository.save();
}
}
3.com.spring.beans.annotation.repository 包下的接口UserRepository及两个实现类
UserRepository接口
package com.spring.beans.annotation.repository;
public interface UserRepository {
void save();
}
实现类UserRepositoryImpl
package com.spring.beans.annotation.repository;
import org.springframework.stereotype.Repository;
// 通过value属性标识组件名称
// 因为value是默认属性,所以value="userRepository" 可省略value=
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository{
@Override
public void save() {
System.out.println("UserRepository save...");
}
}
实现类UserJdbcRepository
package com.spring.beans.annotation.repository;
import org.springframework.stereotype.Repository;
@Repository
public class UserJdbcRepository implements UserRepository{
@Override
public void save() {
System.out.println("userJdbcRepository save ...");
}
}
4.com.spring.beans.annotation包下的示例实体类
package com.spring.beans.annotation;
import org.springframework.stereotype.Component;
@Component
public class TestObj {
}
配置文件
1.指定Spring IOC容器扫描的包
<!-- 指定Spring IOC容器扫描的包 -->
<context:component-scan
base-package="com.spring.beans.annotation">
</context:component-scan>
Spring将扫描到com.spring.beans.annotation包,及其子包下所有带特定注解的类,即TestObj,UserJdbcRepository,UserRepositoryImpl,UserService,UserController
当需要扫描多个包时,可以用逗号分隔
<!-- 指定Spring IOC容器扫描的包 -->
<!-- 可以通过 resource-pattern 指定扫描的资源 -->
<context:component-scan
base-package="com.spring.beans.annotation"
resource-pattern="repository/*.class">
</context:component-scan>
Spring将扫描到com.spring.beans.annotation包下, repository下所有带特定注解的类,即UserJdbcRepository,UserRepositoryImpl
3.使用context:exclude-filter 子节点指定排除哪些表达式的组件(排除特定注解的类)
<!-- context:exclude-filter 子节点指定排除哪些表达式的组件 -->
<context:component-scan
base-package="com.spring.beans.annotation">
<!-- 指定排除扫描 @Repository 注解-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
Spring将扫描com.spring.beans.annotation包下所有带特定注解的类,但不扫描带@Repository注解的类,即TestObj,UserService,UserController
4.使用context:include-filter 子节点指定包含哪些表达式组件(扫描特定的注解),该子节点需要use-default-filters="false"配合使用
<!-- context:include-filter 子节点指定包含哪些表达式组件,该子节点需要use-default-filters="false"配合使用-->
<context:component-scan
base-package="com.spring.beans.annotation"
use-default-filters="false">
<!-- 指定扫描 @Repository 注解-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
Spring将只扫描com.spring.beans.annotation包下带@Repository注解的类,即UserJdbcRepository,UserRepositoryImpl
5.使用context:exclude-filter 子节点指定排除哪些表达式的组件(排除继承或扩展特定的类)
<!-- context:exclude-filter 子节点指定排除哪些表达式的组件 -->
<context:component-scan
base-package="com.spring.beans.annotation">
<!-- 指定排除扫描 UserRepository 接口的实现类-->
<context:exclude-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>
</context:component-scan>
Spring将扫描com.spring.beans.annotation包下所有带特定注解的类,但不扫描继承或扩展UserRepository类,即最终扫描到TestObj,UserService,UserController
6.使用context:include-filter 子节点指定包含哪些表达式组件(扫描继承或扩展特定的类)
<!-- context:include-filter 子节点指定包含哪些表达式组件,该子节点需要use-default-filters="false"配合使用-->
<context:component-scan
base-package="com.spring.beans.annotation"
use-default-filters="false">
<!-- 指定扫描 UserRepository 接口的实现类-->
<context:include-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>
</context:component-scan>
Spring将扫描com.spring.beans.annotation包下
继承或扩展UserRepository类,即UserJdbcRepository,UserRepositoryImpl
二、利用注解建立bean和bean之间的引用关系
2. @Autowired和@Inject,@Resource区别: