Java 依赖注入标准(JSR-330)简介例子

来源:互联网 发布:图论算法对比 编辑:程序博客网 时间:2024/06/13 01:39
       1.之前上一章主要介绍了JSR-330协议用到的一些比较常见的注入标签,使用它们可以简化Spring的开发工作,下面我以一个简单的例子加入说明。

   2.1接口类MessageProvider
public interface MessageProvider {

        public String getMessage();
        
}
  2.2  它的接口实现类
import javax.inject.Inject;
import javax.inject.Named;

@Named("messageProvider")
public class ConfigurableMessageProvider implements MessageProvider {

        private String message = "Default message";

        public ConfigurableMessageProvider() {
        }
        
        @Inject
        @Named("message")
        public ConfigurableMessageProvider(String message) {
                this.message = message;
        }
        
        public void setMessage(String message) {
                this.message = message;
        }

        public String getMessage() {
                return message;
        }        
        
}
注意: 1.@Named("messageProvider")这个标签申明了以后,可以供其他的服务类使用。
            2.        @Inject
                @Named("message")
                 可以注入属性,也可以注入服务类等


  2.3 调用上面类的接口类
public interface MessageRenderer {

        public void render();
        
        public void setMessageProvider(MessageProvider provider);
        
        public MessageProvider getMessageProvider();
        
}

2.4 实现MessageRenderer的实现类,如下所示:
   
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

@Named("messageRenderer")
@Singleton
public class StandardOutMessageRenderer implements MessageRenderer {

    @Inject
    @Named("messageProvider")
    private MessageProvider messageProvider = null;
        
        public void render() {
        if (messageProvider == null) {
            throw new RuntimeException(
                    "You must set the property messageProvider of class:"
                            + StandardOutMessageRenderer.class.getName());
        }

        System.out.println(messageProvider.getMessage());        
        }

        public void setMessageProvider(MessageProvider provider) {
        this.messageProvider = provider;                
        }

        public MessageProvider getMessageProvider() {
        return this.messageProvider;
        }
        
}

2.5 配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="com.apress.prospring3.ch5.jsr330"/>

    <bean id="message" class="java.lang.String">
        <constructor-arg value="You are running JSR330!"/>
    </bean>

</beans>
注意:
      1.<context:component-scan base-package="com.apress.prospring3.ch5.jsr330"/>  表示的是要扫描的类路径,该目录下的JAVA类都会被Spring容器识别.
      2.   <bean id="message" class="java.lang.String">                     
         <constructor-arg value="You are running JSR330!"/>
               </bean>
         申明的这个bean刚好在ConfigurableMessageProvider中使用到了。

2.6 Main函数实现类
import org.springframework.context.support.GenericXmlApplicationContext;

public class Jsr330Example {
        public static void main(String[] args) {

                GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
                ctx.load("classpath:jsr330/jsr330.xml");
                ctx.refresh();
                
                MessageRenderer renderer = ctx.getBean("messageRenderer", MessageRenderer.class);
                renderer.render();
        }

}
(关于它们的具体用法,可以参考Java 依赖注入标准(JSR-330)简介)
   (完,待续...................................)

原创粉丝点击