用注解形式装配Bean

一、spring可以component-scan标签自动扫描指定包下的类,然后把扫描到的类自动注入到IOC容器中,自动注入到IOC容器中的类的实例一般为类名的第一个字母小写(如不特殊指定),一般需要注入的类需要4中方式的注解进行标注:@Component、@Respository、@Service、@Controller。四种注解只是在语义上进行了区分,实际四种注解在标注类时达到同样的作用。

@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件

示例如下:新建一个工程,目录结构为:
用注解形式装配Bean_第1张图片
类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标签下的子标签 和 。但我试验了下,没管用,如果有大神指导,请指点。

你可能感兴趣的:(spring)