1:<!-- 基于spring的核心xml配置文件方式,手动配置一个bean,放入到spring的容器中 --> <!-- <bean>标签:定义一个实例对象,会自动被创建并交给spring容器进行管理 id属性:被spring容器管理的实例对象的唯一标识(变量名),整个容器中,只能是唯一的(不可重复) class属性:指定创建当前实例对象的类型(全类名),spring底层是使用的反射机制,根据指定的目标类型,创建目标实例(必须有空参构造) <property>子标签:给当前创建的实例对象的属性赋值,name属性:指定对象的属性名,value属性:给对象的指定属性名赋值 实例: <bean id="userOne" class="com.kgc.spring.bean.User"> <property name="nickName" value="kh96_spring_one"/> </bean>
2: spring的依赖注入方法:
<!-- spring的依赖注入 --> <!-- 方式1:setter方法注入,通过调用setter方法,给对象属性赋值 --> <bean id="carOne" class="com.kgc.spring.bean.Car"> <property name="brand" value="Bmw325"/> <property name="factory" value="华晨"/> <property name="price" value="300000"/> </bean> <!-- 方式2:构造器注入,通过构造方法,给对象属性赋值,默认是按照构造方法的参数定义顺序赋值 --> <bean id="carTwo" class="com.kgc.spring.bean.Car"> <constructor-arg value="AudiA4"/> <constructor-arg value="一汽"/> <constructor-arg value="320000"/> </bean> <!-- 构造器注入,参数赋值,还可以自定义顺序和类型 index指定参数的位置,type指定参数的类型 --> <bean id="carThree" class="com.kgc.spring.bean.Car"> <constructor-arg value="BenzC200" index="0"/> <constructor-arg value="350000" index="2" type="java.lang.Double"/> <constructor-arg value="北京" index="1"/> </bean> <!-- 引入其它bean:外部bean(bean仍然在容器内,不是在当前bean标签内定义的) ,给当前对象的实体属性,通过property标签的ref属性,指定容器内的其它bean对象 --> <bean id="teacherOne" class="com.kgc.spring.bean.Teacher"> <property name="nickName" value="万千"/> <property name="position" value="班主任"/> <property name="car" ref="carOne"/> </bean> <!-- 引入其它bean:内部bean(写在当前bean标签内),给当前对象的实体属性赋值,只能给当前实例对象使用,外部访问不了(私有) --> <bean id="teacherTwo" class="com.kgc.spring.bean.Teacher"> <property name="nickName" value="李苏杰"/> <property name="position" value="班主任"/> <property name="car"> <!-- 内部bean,不需要定义id --> <bean class="com.kgc.spring.bean.Car"> <property name="brand" value="VolvoS60"/> <property name="factory" value="上海"/> <property name="price" value="280000"/> </bean> </property> </bean> <!-- 集合属性注入bean:list集合 --> <bean id="teacherThree" class="com.kgc.spring.bean.Teacher"> <property name="nickName" value="谢群"/> <property name="position" value="班主任"/> <property name="carList"> <list> <ref bean="carTwo"/> <ref bean="carThree"/> </list> </property> </bean> <!-- 集合属性注入bean:map集合 --> <bean id="teacherFour" class="com.kgc.spring.bean.Teacher"> <property name="nickName" value="朱康"/> <property name="position" value="教员"/> <property name="carMap"> <map> <entry key="小白" value-ref="carTwo"/> <entry key="小黑" value-ref="carThree"/> </map> </property> </bean> <!-- 使用工厂bean,容器中添加自定义实例对象 --> <bean id="carFactoryBean" class="com.kgc.spring.bean.CarFactoryBean"/>
3: spring容器中bean的作用域
<!-- spring容器中bean的作用域 --> <!-- 单例:singleton,是spring容器中bean的实例默认作用域 --> <!-- spring容器创建时,自动创建所有bean的实例,放入容器,且每个实例都是单例的,每次从容器中根据id和class获取bean对象都是同一个,并不会重复创建 --> <bean id="busOne" class="com.kgc.spring.bean.Bus"> <property name="brand" value="金龙"/> <property name="factory" value="厦门"/> <property name="price" value="1200000"/> </bean> <!-- 区别于类的单例,整个程序运行期间,有且只有唯一的实例(单例模式-懒汉和饿汉),而容器中bean的单例,不是指当前类的实例在容器中,只有唯一的实例 而是当创建bean的实例时,此实例时单例(容器内唯一),但是同一个类的实例,容器中可以创建多个,每个都是单例的 --> <bean id="busTwo" class="com.kgc.spring.bean.Bus"> <property name="brand" value="宇通"/> <property name="factory" value="郑州"/> <property name="price" value="1500000"/> </bean> <!-- 多例:prototype,不是spring容器中bean的默认作用域,需要单独指定 --> <!-- spring容器创建时,不会自动创建指定作用域为多列的bean的实例,而是每次通过getBean方法,获取bean的实例时,才会创建bean的实例对象,每调用一次就创建一次,返回的都是新的实例对象 --> <bean id="busThree" class="com.kgc.spring.bean.Bus" scope="prototype"> <property name="brand" value="中通"/> <property name="factory" value="山东"/> <property name="price" value="1800000"/> </bean>
4:测试spring框架的初步使用,从容器中获取bean对象并使用
// 1、创建spring的核心容器对象(应用上下文对象),解析spring的核心配置文件,并将文件中的bean标签进行实例化(创建对象并赋值) ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 2、写法1:从容器中,获取实例对象,根据核心配置文件中,配置的bean标签的id属性值,不足:强制转换,容易出现转换错误 // User userOne = (User) context.getBean("userOne"); // 写法2:从容器中,获取实例对象,不是根据核心配置文件中,配置的bean标签的id属性值,而是根据核心配置文件中,配置的bean标签的class属性指定的目标类型 // 不足:如果容器中存在同类型的多个实例,会报异常org.springframework.beans.factory.NoUniqueBeanDefinitionException // User userTwo = context.getBean(User.class); // 写法3:从容器中,获取实例对象,根据核心配置文件中,配置的bean标签的id属性值和class属性指定的目标类型 User userThree = context.getBean("userTwo", User.class); // 从容器中,获取实例对象,默认情况下,是容器中创建好的那个实例对象,不会重复创建 User userFour = context.getBean("userTwo", User.class); // 对比以前创建对象的写法(对象必须手动new创建,并手动赋值) /*User userOld = new User(); userOld.setNickName("kh96_old"); userOld.sayHello();*/ // 3、使用从容器中获取的实例对象 // userOne.sayHello(); // userTwo.sayHello(); userThree.sayHello(); userFour.sayHello(); // 结果为true,说明从容器获取的是同一个对象 System.out.println(userThree == userFour);