zoukankan      html  css  js  c++  java
  • Spring IoC — 基于Java类的配置

    普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息。

    基于Java类的配置方法和基于XML或基于注解的配置方式相比,前者通过代码的方式更加灵活地实现Bean的实例化及Bean之间的装配,但后面两者都是通过配置声明的方式,在灵活性上要稍逊一些,但是配置上要更简单一些。
     
    UserDao类:
    package com.ioc.cha4_11;
    public class UserDao {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "UserDao{" +
                    "name='" + name + '	' +
                    '}';
        }
        public UserDao() {
            System.out.println("userDao");
        }
    }
    logDao类:
    package com.ioc.cha4_11;
    public class LogDao {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "LogDao{" +
                    "name='" + name + '	' +
                    '}';
        }
        public LogDao() {
            System.out.println("LogDao");
        }
    }

     logonService类:

    package com.ioc.cha4_11;
    public class LogonService {
        private LogDao logDao;
        private UserDao userDao;
        public LogDao getLogDao() {
            return logDao;
        }
        public void setLogDao(LogDao logDao) {
            this.logDao = logDao;
        }
        public UserDao getUserDao() {
            return userDao;
        }
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
        
        public void printHelllo(){
            System.out.println("hello!");
        }
    }

    AppConf类:

    package com.ioc.cha4_11;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    //将一个POJO标注为定义Bean的配置类
    @Configuration
    public class AppConf {
        //以下两个方法定义了两个Bean,并提供了Bean的实例化逻辑
        @Bean
        public UserDao userDao() {
            return new UserDao();
        }
        @Bean
        public LogDao logDao() {
            return new LogDao();
        }
        //定义了logonService的Bean
        @Bean
        public LogonService logonService() {
            LogonService logonService = new LogonService();
            //将前面定义的Bean输入到LogonService Bean中
            logonService.setLogDao(logDao());
            logonService.setUserDao(userDao());
            return logonService;
        }
    }

    beans1.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" 
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
        <bean id="userDao" class="com.ioc.cha4_11.UserDao"/>
        <bean id="logDao" class="com.ioc.cha4_11.LogDao"/>
        <bean id="logonService" class="com.ioc.cha4_11.LogonService"
              p:logDao-ref="logDao" p:userDao-ref="userDao"/>
    </beans>

    测试类:

    package com.ioc.cha4_11;
    /**
     * Created by gao on 16-3-25.
     */
    public class Test {
        public static void main(String[] args) {
            AppConf ac = new AppConf();
            LogonService ls = ac.logonService();
            ls.printHelllo();
        }
    }
    输出结果:
    LogDao
    userDao
    hello!
     
     
    DaoConfig类:
    package com.ioc.cha4_11;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Scope;
    @Configuration
    public class DaoConfig {
        
        
        @Bean(name="userDao")
        public UserDao userDao(){
            return new UserDao();
        }
        //每次调用该方法都会返回一个新的LogDao Bean
         @Scope("prototype")
        @Bean
        public LogDao logDao(){
            return new LogDao();
        }
    }

     ServiceConfig类:

    package com.ioc.cha4_11;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Import;
    @Configuration
    @Import(DaoConfig.class)
    public class ServiceConfig {
        //像普通Bean一样注入DaoConfig
        @Autowired
        private DaoConfig daoConfig;
        @Bean
        public LogonService logonService(){
            LogonService logonService = new LogonService();
            System.out.println(daoConfig.logDao() == daoConfig.logDao());
            //像普通Bean一样,调用Bean相关的方法
            logonService.setLogDao(daoConfig.logDao());
            logonService.setUserDao(daoConfig.userDao());
            return logonService;
        }
    }

    LogonAppConfig类:

    package com.ioc.cha4_11;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.ImportResource;
    @Configuration
    @ImportResource("classpath:com\ioc\cha4_11\beans3.xml")
    public class LogonAppConfig {
        
        @Bean
        @Autowired
        public LogonService logonService(UserDao userDao,LogDao logDao){
            LogonService logonService = new LogonService();
            logonService.setUserDao(userDao);
            logonService.setLogDao(logDao);
            return logonService;        
        }
    }

    beans2.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" 
        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.0.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        <context:component-scan base-package="com.ioc.cha4_11"
            resource-pattern="AppConf.class" />
    </beans>

    beans3.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-3.0.xsd">
        <bean id="userDao" class="com.ioc.cha4_11.UserDao"/>
        <bean id="logDao" class="com.ioc.cha4_11.LogDao"/>
    </beans>

    测试类:

    package com.ioc.conf;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class JavaConfigTest {
        public static void main(String[] args) {
            
    //1.通过构造函数加载配置类        
    //         ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);
    //2.通过编码方式注册配置类
    //         AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    //         ctx.register(DaoConfig.class);
    //         ctx.register(ServiceConfig.class);
    //         ctx.refresh();
    //3.通过XML组装@Configuration配置类所提供的配置信息
    //         ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaotao/conf/beans2.xml");
    //4.通过@Configuration组装XML配置所提供的配置信息
    //         ApplicationContext ctx = new AnnotationConfigApplicationContext(LogonAppConfig.class);
            //5.@Configuration的配置类相互引用
             ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoConfig.class,ServiceConfig.class);
             LogonService logonService = ctx.getBean(LogonService.class);
             System.out.println((logonService.getLogDao() !=null));
             logonService.printHelllo();   
        }
    }
     
     
     
     
     
     
     
  • 相关阅读:
    PetShop4.0 工厂模式及Profile Provider实现(转载)
    [转]asp.net 2.0中的url映射
    今天将IE升级到了7.0版
    元旦放假了!
    ASP.NET AJAX中出现“Type”未定义,“Sys”未定义的解决办法
    windows2003下如何关闭共享?
    [转]SQL中CONVERT转化函数的用法
    [转]利用GridView显示主细表并一次编辑明细表所有数据的例子
    Bcastr 3.0 flash 通用图片轮换播放器
    为程序程序集签名
  • 原文地址:https://www.cnblogs.com/yangyquin/p/5322591.html
Copyright © 2011-2022 走看看