zoukankan      html  css  js  c++  java
  • spring 配置bean

    概要:



    在spring的IOC容器里配置Bean

    在xml文件里通过bean节点来配置bean


    id:Bean的名称



    spring容器

    在spring IOC容器读取Bean配置创建Bean实例之前。必须对它进行实例化。仅仅有在容器实例化后,才干够从IOC容器里获取Bean实例并使用

    spring提供了两种类型的IOC容器实现

    • BeanFactory:IOC容器的基本实现
    • ApplicationContext 提供了很多其它的高级特性。是BeanFactory的子接口
    • BeanFactory是spring框架的基础设施,面向spring本身,ApplicationContext面向使用spring框架的开发人员。差点儿全部的应用场合都直接使用ApplicationContext而非底层的BeanFactory
    • 不管使用何种方式。配置文件是同样的



    ApplicationContext
    • ApplicationContext的主要实现类:
      • ClassPathXmlApplication:从类路径下载入配置文件
      • FileSystemXmlApplicationContext:从文件系统中载入配置文件
    • ConfigurableApplicationContext扩展于ApplicationContext,新添加两个主要方法:refresh()和close()。让ApplicationContext具有启动,刷新和关闭上下文的能力
    • ApplicationContext在初始化上下文时就实例化全部单例的Bean。
    • WebApplicationContext是专门为WEB应用而准备的,它同意从相对于WEB根文件夹的路径中完毕初始化工作

    从IOC容器中获取Bean
    • 调用ApplicationContext的getBean()方法


    依赖注入的方式
    spring支持3种依赖注入的方式
    • 属性注入
    • 构造器注入
    • 工厂方法注入(非常少使用,不推荐)

    属性注入
    • 属性注入即通过setter方法注入Bean的属性值或依赖的对象
    • 属性注入使用<property>元素,使用name属性指定Bean的属性名称。value属性或<value>子结点指定属性值
    • 属性注入是实际应用中最经常使用的注入方式

     
    构造方法注入
    • 通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就能够使用
    • 构造器注入在<constructor-arg>元素里声明属性。<constructor-arg>中没有name属性


    实例代码:


    Car.java
    package com.coslay.beans;
    
    public class Car {
    	private String brand;
    	private String corp;
    	private double price;
    	private int maxSpeed;
    	public Car(String brand, String corp, double price) {
    		super();
    		this.brand = brand;
    		this.corp = corp;
    		this.price = price;
    	}
    	
    	
    	
    	public Car(String brand, String corp, int maxSpeed) {
    		super();
    		this.brand = brand;
    		this.corp = corp;
    		this.maxSpeed = maxSpeed;
    	}
    
    
    
    	public String toString() {
    		return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price
    				+ ", maxSpeed=" + maxSpeed + "]";
    	}
    }
    

    HelloWorld.java
    package com.coslay.beans;
    
    public class HelloWorld {
    	private String name;
    	
    	public void setName(String name){
    		System.out.println("setName: ");
    		this.name = name;
    	}
    	
    	public void hello(){
    		System.out.println("hello: "+name);
    	}
    	
    	public HelloWorld(){
    		System.out.println("HelloWorld's Constructor...");
    	}
    }
    

    Main.java
    package com.coslay.spring;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.coslay.beans.Car;
    import com.coslay.beans.HelloWorld;
    
    public class Main {
    	public static void main(String[] args) {
    		
    //		//创建HelloWorld的一个对象
    //		HelloWorld helloWorld = new HelloWorld();
    //		//为name属性赋值
    //		helloWorld.setName("yyz");
    //      使用spring以后,这两步可交给spring完毕		
    		
    		
    		//1.创建spirng的IOC容器对象
    		//ApplicationContext 代表IOC容器
    		//ClassPathXmlApplicationContext:是ApplicationContext接口的实现类,该实现类从类路径下载入配置文件
    		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    		//创建容器的时候会调用全部bean对象的构造器,并为bean注入(赋值)
    		
    		//2.从IOC容器中获取Bean实例
    		//利用id定位到IOC容器中的bean
    	    //HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld");
    		//利用类型返回IOC容器中的Bean。但要求IOC容器中必须仅仅能有一个该类型的Bean
    		//HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
    		
    		//调用hello方法
    		//helloWorld.hello();
    		
    		Car car = (Car) ctx.getBean("car");
    		System.out.println(car);
    		
    		Car car2 = (Car) ctx.getBean("car2");
    		System.out.println(car2);
    	}
    }
    

    applicationContext.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 class:bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean中必须有无參数的构造器 id:标识容器中的bean。id唯一 --> <bean id="helloWorld" class="com.coslay.beans.HelloWorld"> <property name="name" value="yyz"></property> </bean> <!-- 通过构造方法来配置bean的属性 --> <bean id="car" class="com.coslay.beans.Car"> <constructor-arg value="Audi" index="0"></constructor-arg> <constructor-arg value="ShangHai" index="1"></constructor-arg> <constructor-arg value="300000" type="double"></constructor-arg> </bean> <!-- 使用构造器注入属性值能够指定參数的位置和參数的类型,以区分重载的构造器 --> <bean id="car2" class="com.coslay.beans.Car"> <constructor-arg value="Baoma" type="java.lang.String"></constructor-arg> <constructor-arg value="Shanghai" type="java.lang.String"></constructor-arg> <constructor-arg value="240" type="int"></constructor-arg> </bean> </beans>



  • 相关阅读:
    NanoProfiler
    NanoProfiler
    Open Source Cassandra Gitbook for Developer
    Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
    Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
    Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
    Android Fragment使用(一) 基础篇 温故知新
    Set up Github Pages with Hexo, migrating from Jekyll
    EventBus源码解析 源码阅读记录
    Android M Permission 运行时权限 学习笔记
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5098768.html
Copyright © 2011-2022 走看看