1.组件扫描
Spring3.0后为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。
A.开启注解扫描:base-package为需要扫描的包(含子包)
<context:component-scan base-package="com.web"></context:component-scan>
B.在组件bean上定义类注解,在组件bean的依赖属性上,定义依赖注解
/**
* spring 注解扫描演示 bean
* @Component:通用组件
* @Scope : 设置组件的作用域
* prototype:该模式下会每次getBean都创建一个对象,并且都是延迟加载的
* @Lazy:设置组件是否延迟加载
* true为延迟加载 false为容器创建则立即加载bean
* @PostConstruct: 初始化方法注解
* @PreDestroy: 销毁方法注解
* @author Administrator
*/
@Component
//@Scope("prototype")
@Lazy(true)
public class ExampleBean { public ExampleBean(){
System.out.println("ExampleBean 无参构造被调用。。。。。。");
} @PostConstruct
public void init(){
System.out.println("ExampleBean 初始化方法调用.....");
} @PreDestroy
public void destroy(){
System.out.println("ExampleBean 销毁方法调用......");
} }
注解下的类扫描和依赖注入
依赖关系的注解:
注意:
a.此类注解可以在属性上面设置,也可以在set方法上面设置
b.一般用于属性上,因为注解实现下set方法是可以省略不写的
c.下面的多个依赖注解,只需要使用一个Resource即可
/**
* Dao访问数据库
* @Repository:设置数据访问层的类级别注解
* @Resource: 用于引用类型属性的值注入 spring会先按属性名字从容器中查找是否有适合的bean
* 如果找不到,再按照类型查找是否有适合的bean,如果找到bean则注入进去,
* 如果找不到合适的bean,就会报bean不存在的异常 建议还是遵从默认规则
* name属性可以用于指定查找的bean的名字
*
* @author Administrator
*
*/
@Repository
public class EmpDaoImpl implements EmpDao{ @Resource/*(name="DbUtil")*/
private DbUtil dbUtil;//通过dbUtil 获取数据库连接
/**
* @Service :服务层的类级别注解
* @Autowired: 按照类型先查找,再按照名字找(避免两个同类型的bean的问题)
* @Qualifier("empDaoImpl") :指定容器查找的bean的名字
* @author Administrator
*
*/
@Service
public class EmpServiceImpl implements EmpService{ @Autowired
@Qualifier("empDaoImpl")
EmpDao empDao;//spring 容器中有EmpDaoImpl的对象存在,父类引用指向子类对象
/*
*
*
* @Value: 用于注解注入值,可以给基本类型和字符串类型直接赋值 可以写在属性上,也可以写在setter上
* 依赖注入注解下,省略setter方法,直接将注解写在属性上即可
*/
@Component("DbUtil")
public class DbUtil {
//从配置文件中找到driver对应的值
@Value("#{props.driver}")
private String driver;
private String username;
@Value("#{props.password}")
private String password;
@Value("#{props.url}")
private String url;
public void setDriver(String driver) {
try {
Class.forName(driver);//加载驱动
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.driver = driver;
} @Value("#{props.username}")
public void setUsername(String username) {
this.username = username;
} }
<util:properties id="props" location="classpath:db.properties"></util:properties>
/**
* @Controller: 设置控制层的类级别注解
* @Inject:标准注解,属于通用注解,该注解功能不属于spring的
* 用于设置属性注入,并且可以通过@Named指定从spring容器中查找的bean的名字
* @author Administrator
*
*/
@Controller
public class EmpController {
@Inject
EmpService empServiceImpl;