zoukankan      html  css  js  c++  java
  • Spring 中 Bean 的定义及注入 Value

    Spring 中,bean 的定义有三种方式:

    • 基于 XML 的配置
    • 基于注解的配置
    • 基于 Java 类的配置

    Bean 的注入有两种方式:基于构造函数的依赖注入和基于设值函数的依赖注入。

    这里我们先给大家介绍第一种,基于 XML 的配置方法,这种方法在 Spring 中是最常见的。

    基于 XML 的配置方法

    基于 XML 的配置方法又分为三种写法:一般方法,缩写方法,pschema 方法。先看下面的 Bean:FileNameGenerator.java,其中包含两个 properties,name 和 type,我们向两个 properties 注入 value。

    在 src/main/java 路径下,新建类:FileNameGenerator.java

    package com.shiyanlou.spring.bean;
    
    public class FileNameGenerator {
        private String name;
        private String type;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
           this.type = type;
        }
        /*
        *打印文件名和文件类型的方法
        */
        public void printFileName() {
            System.out.println("FileName & FileType  is  :  "+name+" & "+type);
        }
    }
    

    接着在 src/main/resources 路径下新建 SpringBeans.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 = "FileNameGenerator" class = "com.shiyanlou.spring.bean.FileNameGenerator">
            <property name = "name">
                <value>shiyanlou</value>
            </property>
            <property name = "type">
                <value>txt</value>
            </property>
        </bean>
        <!-- 另一重配置方法 缩写方法-->
        <!--
            <bean id = "FileNameGenerator" class = "com.shiyanlou.spring.bean.FileNameGenerator">
                   <property name = "name" value = "shiyanlou" />
                   <property name = "type" value = "txt" />
               </bean>
         -->
    </beans>
    

    第三种方法:pschema 方法。

    <?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.xsd">
    
        <!--<bean id = "FileNameGenerator" class = "com.shiyanlou.spring.bean.FileNameGenerator">
            <property name = "name">
                <value>shiyanlou</value>
            </property>
            <property name = "type">
                <value>txt</value>
            </property>
        </bean>-->
        <bean id = "FileNameGenerator" class = "com.shiyanlou.spring.bean.FileNameGenerator"
                 p:name = "shiyanlou" p:type = "txt" />
    </beans>
    

    注意,这种方法需要在 bean 的配置文件 xml 中,加入声明。

    xmlns:p = "http://www.springframework.org/schema/p"
    

    最后需要在 com.shiyanlou.spring.bean 路径下写一个 App.java。

    package com.shiyanlou.spring.bean;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.shiyanlou.spring.bean.FileNameGenerator;
    
    public class App
    {
        private static ApplicationContext context;
    
            public static void main( String[] args ) {
                context = new ClassPathXmlApplicationContext("SpringBeans.xml");
    
                FileNameGenerator obj = (FileNameGenerator) context.getBean("FileNameGenerator");
                obj.printFileName();
            }
    }
    

    基于注解的配置

    注解是为 Spring 容器提供 Bean 定义的信息,把 XML 定义的信息通过类注解描述出来。众所周知,Spring 容器三大要素:Bean 定义、Bean 实现类以及 Spring 框架。如果采用 XML 配置,Bean 定义和 Bean 实现类本身分离,而采用注解配置,Bean 定义在 Bean 实现类上注解就可以实现。在后面我们会有一节实验专门讲解基于注解的配置,以下先简单列举几个注解方式。

    @Component
    被此注解标注的类将被 Spring 容器自动识别,自动生成 Bean 定义。即:

    packeage com.shiyanlou.spring;
    
    @Component("shiyanlou")
    public class shiyanlou{
    
    }
    

    与在 XML 中配置以下效果相同:

    <bean id = "shiyanlou" class = "com.shiyanlou.spring.shiyanlou">
    

    除此之外,Spring 有三个与 @Component 等效的注解:

    1、@Controller:对应表现层的 Bean,也就是 Action。
    2、@Service:对应的是业务层 Bean。
    3、@Repository:对应数据访问层 Bean。

    @Autowired

    @Autowired 可以用来装配 bean,都可以写在字段上,或者方法上。使用 @Autowired,首先要在在 applicationContext.xml 中加入 。@Autowired 默认按类型装配,默认情况下要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。例如:

    @Autowired()
    @Qualifier("shiyanlouDao")
    private ShiyanlouDao shiyanlouDao;
    

    Configuration

    通过使用注释 @Configuration 告诉 Spring,这个 Class 是 Spring 的核心配置文件,并且通过使用注解 @Bean 定义 bean,举例说明:

    package com.shiyanlou.spring.java_config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class AppConfig {
    
        @Bean(name = "animal")
        public IAnimal getAnimal(){
            return new Dog();
        }
    }
    

    App.java 内容:

    package com.shiyanlou.spring.java_config;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class App {
    
        private static ApplicationContext context;
    
        public static void main(String[] args) {
            context = new AnnotationConfigApplicationContext(AppConfig.class);
            IAnimal obj = (IAnimal) context.getBean("animal");
            obj.makeSound();
    
        }
    
    }
    

    通过上面的 @Configuration 注解,相当于在 ApplicationContext.xml 文件中添加如下配置,使用了 @Configuration + @Bean 就不需要添加了:

    <bean id = "animal" class = "com.shiyanlou.spring.java_config.Dog">
    
  • 相关阅读:
    木有晚餐吃的教训暴力图的时候
    HDU1231最大连续子序列DP
    java连连看(GUI有进度条加背景音乐)
    HDU2064简单hanno塔
    HDU1232并查集入门(畅通工程)
    HDU3460Ancient Printer(trie)
    在window下搭建php+apche+masql的方法(个人的蛋疼经历,绝对可靠)
    Java学生管理系统(GUI)(又写了这种破玩意儿了老师,放过我们吧,能不能来点新意)
    VUE使用elpagination添加分页功能
    JS 中深拷贝的几种实现方法
  • 原文地址:https://www.cnblogs.com/sakura579/p/13917452.html
Copyright © 2011-2022 走看看