zoukankan      html  css  js  c++  java
  • 01-spring定义bean的几种方法

    01-spring定义bean的几种方法

    1、<bean/ >方法

    首先我们创建一个User对象,并且实现它的getter和setter方法

    public class User {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    然后我们在resource下创建一个spring.xml的配置文件,然后在spring.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="user" class="nuc.edu.User"/>
    </beans>
    

    然后编写测试方法,在控制台打印输出

    public class Main {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring" +
                    ".xml");
    
            User user = classPathXmlApplicationContext.getBean("user", User.class);
            System.out.println(user);
        }
    }
    

    image-20210315132419503

    2、@Bean

    首先我们创建一个Config.java类,然后注入@Bean

    public class Config {
        @Bean
        public User user(){
            return new User();
        }
    }
    

    然后编写测试类方法

    public class Main {
        public static void main(String[] args) {
            //ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring" +
            //        ".xml");
    
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
            User user = applicationContext.getBean("user", User.class);
            System.out.println(user);
        }
    }
    

    同样我们在控制台获得了User对象

    image-20210315132933680

    3、@Component

    我们将Config.class类里的方法注释掉,然后添加@ComponentScan("nuc.edu"),把Config.class类交由spring容器管理

    @ComponentScan("nuc.edu")
    public class Config {
    //    @Bean
    //    public User user(){
    //        return new User();
    //    }
    }
    

    然后我们在User类中添加@ComponentScan注解

    @Component
    public class User {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    最后我们编写测试

    public class Main {
        public static void main(String[] args) {
            //ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring" +
            //        ".xml");
    
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
            User user = applicationContext.getBean("user", User.class);
            System.out.println(user);
        }
    }
    

    也在控制台中打印了

    image-20210315133415928

    4、BeanDefinition

    public class Main {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
            AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
    
            beanDefinition.setBeanClass(User.class);
            applicationContext.registerBeanDefinition("user",beanDefinition);
            applicationContext.refresh();
    
            User user = applicationContext.getBean("user", User.class);
            System.out.println(user);
        }
    }
    

    image-20210315133743379

    5、通过FactoryBean间接的定义一个Bean

    首先我们创建一个Person对象

    public class Person {
    }
    

    然后我们创建一个NucFactoryBean类并且实现FactoryBean,并且对它的方法进行重写

    public class NucFactoryBean implements FactoryBean {
        @Override
        public Object getObject() throws Exception {
            Person person = new Person();
            System.out.println(person);
            return person;
        }
    
        @Override
        public Class<?> getObjectType() {
            return Person.class;
        }
    }
    

    然后我们再写主类方法

    public class Main {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
            AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
    
            beanDefinition.setBeanClass(NucFactoryBean.class);
            applicationContext.registerBeanDefinition("user",beanDefinition);
            applicationContext.refresh();
    
            User user = applicationContext.getBean("user", User.class);
            System.out.println(user);
        }
    }
    

    运行代码出错:

    ​ 提示我们期望的应该是nu.edu.User类,但是实际上的确是nuc.edu.Person类

    其实:

    &user :NucFactoryBean类型的对象

    user:person类型的对象

    我们需要将代码进行修改,主需要修改一行代码即可

    NucFactoryBean user = applicationContext.getBean("&user", NucFactoryBean.class);
    

    然后运行,测试,看控制台结果

    image-20210315135919661

    我们还有另外一种更改的方法就是改为Person类型

    Person user = applicationContext.getBean("user", Person.class);
    

    通过控制台打印结果可以看出

    image-20210315140047289

    我们可以看出applicationContext.getBean()得到的Person对象和NucFactoryBean里new出来的对象是同一个对象

    6、通过Supplier定义Bean对象

    示例代码

    public class Main {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    
            applicationContext.registerBean(User.class, new Supplier<User>() {
                @Override
                public User get() {
                    User user = new User();
                    user.setName("zhangsan");
                    return user;
                }
            });
    
            applicationContext.refresh();
    
            User user = applicationContext.getBean("user", User.class);
            System.out.println(user.getName());
        }
    }
    

    通过控制台打印的结果可以看到

    image-20210315141424986

    此时的User对象并不是我们自己写的User类,而是在Supplier定义的User对象

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/coderD/p/14537418.html
Copyright © 2011-2022 走看看