一、spring可以component-scan
标签自动扫描指定包下的类,然后把扫描到的类自动注入到IOC容器中,自动注入到IOC容器中的类的实例一般为类名的第一个字母小写(如不特殊指定),一般需要注入的类需要4中方式的注解进行标注:@Component、@Respository、@Service、@Controller。四种注解只是在语义上进行了区分,实际四种注解在标注类时达到同样的作用。
@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件
示例如下:新建一个工程,目录结构为:
类ComponentBean :
package com.lzj.spring.component;
import org.springframework.stereotype.Component;
@Component
public class ComponentBean {
public void show() {
System.out.println("ComponentBean........");
}
}
类ControllerBean :
package com.lzj.spring.controller;
import org.springframework.stereotype.Controller;
@Controller
public class ControllerBean {
public void show() {
System.out.println("ControllerBean.......");
}
}
类RepositoryBean :
package com.lzj.spring.repository;
import org.springframework.stereotype.Repository;
@Repository
public class RepositoryBean {
public void show() {
System.out.println("RespositoryBean........");
}
}
类Service :
package com.lzj.spring.service;
@org.springframework.stereotype.Service
public class Service {
public void show() {
System.out.println("Service.......");
}
}
spring的配置文件bean.xml为:
<context:component-scan base-package="com.lzj.spring">context:component-scan>
测试类SpringTest :
public class SpringTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("bean.xml");
/*ComponentBean 类中的@Component注解默认把类名的一个字母小写,即componentBean实例注入到了IOC容器中*/
ComponentBean componentBean = (ComponentBean) ctx.getBean("componentBean");
componentBean.show();
/*ControllerBean 类中的@Controller注解默认把类名的一个字母小写,即controllerBean实例注入到了IOC容器中*/
ControllerBean controllerBean = (ControllerBean) ctx.getBean("controllerBean");
controllerBean.show();
/*RepositoryBean 类中的@Repository注解默认把类名的一个字母小写,即repositoryBean实例注入到了IOC容器中*/
RepositoryBean repositoryBean = (RepositoryBean) ctx.getBean("repositoryBean");
repositoryBean.show();
/*Service 类中的@Service 注解默认把类名的一个字母小写,即service 实例注入到了IOC容器中*/
Service service = (Service) ctx.getBean("service");
service.show();
/*关闭IOC容器中,关闭后就不能从bean.xml指定的这个容器中进行获取实例了。但是如果还有其他的配置文件,还可以从其他的IOC容器中进行获取实例*/
ctx.close();
}
}
输出结果:
ComponentBean........
ControllerBean.......
RespositoryBean........
Service.......
二、配置属性
1、在实际应用中,若想注入IOC容器中的实例名字由人为指定,而不是自动类名的第一个字母小写,可以在注入bean的注解中进行指定。例如
package com.lzj.spring.component;
import org.springframework.stereotype.Component;
/*在标注Component注解时,就指定注入到IOC容器中的ComponentBean 的名字为beanComponent。也可以这样写:@Component(value="beanComponent"),因为默认值为value属性*/
@Component("beanComponent")
public class ComponentBean {
public void show() {
System.out.println("ComponentBean........");
}
}
从容器中获取bean的实例:
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("bean.xml");
ComponentBean componentBean = (ComponentBean) ctx.getBean("beanComponent");
componentBean.show();
2、限定扫描的类:resource-pattern属性。在用component-scan标签扫描注入到IOC容器中的bean实例时,可以指定component-scan标签中的resource-pattern属性来限制扫描包下的那些类的实例。例如:
/*resource-pattern属性指定了只扫描com.lzj.spring包下的component子包下的类*/
<context:component-scan base-package="com.lzj.spring"
resource-pattern="component/*.class">context:component-scan>
3、限定扫描的类:component-scan标签下的子标签 和 。但我试验了下,没管用,如果有大神指导,请指点。