zoukankan      html  css  js  c++  java
  • 01.Spring引入

    spring引入

    第一行代码升级版--helloworld

    /**
     * 升级版的HelloWorld,可以在不更改代码的情况下更改消息
     * 但负责渲染消息的组件也负责获取消息
     */
    public class HelloWorld {
        public static void main(String[] args){
            if (args.length>0){
                System.out.println(args[0]);
            }else {
                System.out.println("HelloWorld!");
            }
        }
    }
    

    helloworld解耦,消息提供与渲染分离

    /**
     * 消息提供者
     */
    public interface MessageProvider {
        String getMessage();
    }
    
    /**
     * 消息渲染
     */
    public interface MessageRenderer {
        void render();
        void setMessageProvider(MessageProvider provider);
        MessageProvider getMessageProvider();
    }
    
    public class HelloWorldMessageProvider implements MessageProvider {
        @Override
        public String getMessage() {
            return "Hello World!";
        }
    }
    
    public class StandardOutMessageRenderer implements MessageRenderer {
        private MessageProvider messageProvider;
        @Override
        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());
        }
    
        @Override
        public void setMessageProvider(MessageProvider provider) {
            this.messageProvider = provider;
        }
    
        @Override
        public MessageProvider getMessageProvider() {
            return this.messageProvider;
        }
    }
    
    public class HelloWorldDecoupled {
        public static void main(String[] args){
            MessageRenderer mr = new StandardOutMessageRenderer();
            MessageProvider mp = new HelloWorldMessageProvider();
            mr.setMessageProvider(mp);
            mr.render();
        }
    }
    

    虽然解耦,但更改接口的实现意味着更改代码,解决这个问题可以创建一个简单的工厂

    msf.properties

    renderer.class=com.anocation.helloword.StandardOutMessageRenderer
    provider.class=com.anocation.helloword.HelloWorldMessageProvider
    
    
    /**
     * 消息工厂
     */
    public class MessageSupportFactory {
        private static MessageSupportFactory instance;
        private Properties props;
        private MessageRenderer renderer;
        private MessageProvider provider;
    
        public MessageSupportFactory() {
            props = new Properties();
            try {
                props.load(this.getClass().getResourceAsStream("/msf.properties"));
                String rendererClass = props.getProperty("renderer.class");
                String providerClass = props.getProperty("provider.class");
                renderer = (MessageRenderer) Class.forName(rendererClass).newInstance();
                provider = (MessageProvider) Class.forName(providerClass).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        static {
            instance = new MessageSupportFactory();
        }
        public static MessageSupportFactory getInstance(){
            return instance;
        }
        public MessageRenderer getMessageRenderer(){
            return renderer;
        }
        public MessageProvider getMessageProvider(){
            return provider;
        }
    }
    
    public class HelloWorldDecoupledWithFactory {
        public static void main(String[] args){
            MessageProvider mp = MessageSupportFactory.getInstance().getMessageProvider();
            MessageRenderer mr = MessageSupportFactory.getInstance().getMessageRenderer();
            mr.setMessageProvider(mp);
            mr.render();
        }
    }
    

    使用spring

    前面但仍然存在问题,第一个问题是必须编写大量的粘合代码将应用程序拼凑在一起,同时保持组件松祸合。第二个问题是仍然需要手动提供 MessageProvider 实例的 MessageRenderer 实现

    app-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="provider" class="com.anocation.helloword.HelloWorldMessageProvider"/>
        <!--renderer 依赖MessageProvider接口来获取需要渲染的消息-->
        <bean id="renderer"
              class="com.anocation.helloword.StandardOutMessageRenderer">
            <property name="messageProvider" ref="provider"/>
        </bean>
    </beans>
    
    public class HelloWorldSpringDI {
        public static void main(String[] args){
            ApplicationContext ctx = new ClassPathXmlApplicationContext("app-config.xml");
            MessageRenderer mr = ctx.getBean("renderer", MessageRenderer.class);
            mr.render();
        }
    }
    

    使用注解方式

    @Configuration
    public class HelloWorldConfiguration {
        @Bean
        public MessageProvider provider(){
            return new HelloWorldMessageProvider();
        }
        @Bean
        public MessageRenderer renderer(){
            MessageRenderer renderer = new StandardOutMessageRenderer();
            renderer.setMessageProvider(provider());
            return renderer;
        }
    }
    
    public class HelloWorldSpringAnnotated {
        public static void main(String[] args){
            ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
            MessageRenderer mr = ctx.getBean("renderer", MessageRenderer.class);
            mr.render();
        }
    }
    
  • 相关阅读:
    标准化R包开发流程
    创建Rdemo项目
    rJava在ubuntu上的安装
    Linux初始root密码设置
    检查网卡错误
    统计学习方法-李航 第一章
    ubuntu16.04细节设置
    linux指令学习
    Python在ubuntu16.04上环境搭建
    kuberneets 1.17 设置 kube-reserved, system-reserved
  • 原文地址:https://www.cnblogs.com/fly-book/p/12245338.html
Copyright © 2011-2022 走看看