IOC操作Bean管理(基于xml方式)
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!

⭕在
spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
⭕在
bean标签有很多属性,介绍常用的属性
id属性:唯一标识class属性:类全路径(包类路径)name属性:作用与id属性一致,区别是name属性里面可以用特殊字符,但现在很少用name属性了
⭕创建对象时候,默认也是执行无参数构造方法完成对象创建,如果在类里用有参构造器覆盖无参构造器,运行时则会报错。
DI:依赖注入,就是注入属性
① 创建类,定义属性和对应的 set 方法
//演示使用 set 方法进行注入属性
public class Person {
private String name;
private String food;
public void setName(String name) {
this.name = name;
}
public void setFood(String food) {
this.food = food;
}
public void eat(){
System.out.println(this.name+"吃"+this.food);
}
}
② 在 spring 配置文件配置对象创建,配置属性注入
<!--配置 Person 对象创建-->
<bean id="person_ir" class="com.ir.spring5.Person">
<!--使用 property 完成属性注入
name:类里面属性名称
value:向属性注入的值
-->
<property name="name" value="小老师ir"></property>
<property name="food" value="java"></property>
</bean>
property标签中的属性name是相应的类中的属性名,value是指要赋予属性的值
③ 测试代码:
@Test
public void testEat(){
//1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("person1.xml");
//2. 获取配置创建的对象
Person person = context.getBean("person_ir",Person.class);
//3. 测试
System.out.println(person);//com.ir.spring5.Person@1b26f7b2
person.eat(); //[小老师ir]吃java
}
① 创建类,定义属性,创建属性对应有参数构造方法
package com.ir.spring5;
public class Car {
private String number;
private String speed;
public Car(String number, String speed) {
this.number = number;
this.speed = speed;
}
public void run(){
System.out.println(number+"::"+speed);
}
}
② 在 spring 配置文件中进行配置
<!--配置 Car 对象创建-->
<bean id="car_ir" class="com.ir.spring5.Car">
<!--有参数构造注入属性-->
<!--方式1:通过name属性来确定类中的属性名-->
<constructor-arg name="number" value="01"></constructor-arg>
<constructor-arg name="speed" value="200"></constructor-arg>
<!--方式2:通过索引来确定属性名-->
<!-- <constructor-arg index="0" value="01"></constructor-arg>-->
<!-- <constructor-arg index="1" value="200"></constructor-arg>-->
</bean>
测试:
@Test
public void testCar(){
//1.加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//2.获取配置文件创建的对象
Car car = context.getBean("car_ir",Car.class);
//3.测试
System.out.println(car);//com.ir.spring5.Car@a74868d
car.run();//01::200
}
使用 p 名称空间注入,可以简化基于 xml 配置方式
① 添加 p 名称空间在配置文件中

② 进行属性注入,在 bean 标签里面进行操作
<bean id="person_ir" class="com.ir.spring5.Person" p:name="小老师ir" p:food="c++">
</bean>
⭕ null 值
<bean id="person_ir" class="com.ir.spring5.Person">
<property name="name" >
<null/>
</property>
<property name="food" value="java"></property>
</bean>
@Test
public void testEat(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Person person = context.getBean("person_ir",Person.class);
System.out.println(person);//com.ir.spring5.Person@1b26f7b2
person.eat(); //[null]吃java
⭕ 属性值包含特殊符号
● 方法一:把<>进行转义
<>
<bean id="person_ir" class="com.ir.spring5.Person">
<property name="name" value="<小老师ir>"></property>
<property name="food" value="java"></property>
</bean>
@Test
public void testEat(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Person person = context.getBean("person_ir",Person.class);
System.out.println(person);//com.ir.spring5.Person@a74868d
person.eat(); //<小老师ir>吃java
● 方法二:把带特殊符号内容写到 CDATA
<bean id="person_ir" class="com.ir.spring5.Person">
<property name="name" >
<value>
<![CDATA[<<小老师ir>>]]>
</value>
</property>
<property name="food" value="java"></property>
</bean>
@Test
public void testEat(){
//1.加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//2. 获取配置创建的对象
Person person = context.getBean("person_ir",Person.class);
//3. 测试
System.out.println(person);//com.ir.spring5.Person@a74868d
person.eat(); //[<<小老师ir>>]吃java
演示步骤:
① 创建两个类 service 类和 dao 类
② 在 service 调用 dao 里面的方法
UserDao
package Dao;
/**
* @author shkstart
* @create 2022-05-07 23:08
*/
public interface UserDao {
public void update();
}
UserService
package Service;
import Dao.UserDao;
/**
* @author shkstart
* @create 2022-05-07 23:08
*/
public class UserService {
//创建 UserDao 类型属性,生成 set 方法
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service add...............");
userDao.update();
}
}
UserDaoImpl
package Dao;
/**
* @author shkstart
* @create 2022-05-07 23:08
*/
public class UserDaoImpl implements UserDao{
@Override
public void update() {
System.out.println("dao update...........");
}
}
③ 在 spring 配置文件中进行配置
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!--创建 UserService 对象-->
<bean id="userservice" class="Service.UserService">
<!--注入 userDao 对象
name 属性:类里面属性名称
ref 属性:创建 userDao 对象 bean 标签 id 值
-->
<property name="userDao" ref="userdaoimpl"></property>
</bean>
<!--创建 UserDaoImpl 对象-->
<bean id="userdaoimpl" class="Dao.UserDaoImpl"></bean>
</beans>
测试:
@Test
public void testBean(){
ApplicationContext context1 = new ClassPathXmlApplicationContext("bean2.xml");
UserService userService = (UserService)context1.getBean("userservice");
System.out.println(userService);//Service.UserService@eafc191
userService.add();
// service add...............
// dao update...........
}
① 一对多关系:部门和员工,一个部门有多个员工,一个员工属于一个部门,部门是一,员工是多
② 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示
部门类
package Bean;
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
员工类
package Bean;
public class Emp {
private String ename;
private String gender;
//员工属于某一个部门,使用对象形式表示
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
public void add() {
System.out.println(ename+"::"+gender+"::"+dept);
}
}
③ 在 spring 配置文件中进行配置
<!--内部bean-->
<bean id="emp" class="Bean.Emp">
<!--设置两个属性-->
<property name="ename" value="小老师ir"></property>
<property name="gender" value="女"></property>
<!--设置对象类型属性-->
<property name="dept">
<bean id="dept" class="Bean.Dept">
<property name="dname" value="安保部"></property>
</bean>
</property>
</bean>
测试
@Test
public void testEmp(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Emp emp = (Emp)context.getBean("emp");
System.out.println(emp);//Bean.Emp@69b0fd6f
emp.add();//小老师ir::女::Dept{dname='安保部'}
}
方式一:
在 spring 配置文件
bean4.xml中进行配置
<!--级联赋值-->
<bean id="emp" class="Bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="小老师ir"></property>
<property name="gender" value="女"></property>
<!--级联赋值-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="Bean.Dept">
<property name="dname" value="技术部"></property>
</bean>
测试:
@Test
public void testEmp2(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Emp emp = (Emp)context.getBean("emp");
System.out.println(emp);//Bean.Emp@462d5aee
emp.add();//小老师ir::女::Dept{dname='技术部'}
}
方式二:员工属于某一个部门,使用对象形式表示
<!--级联赋值-->
<bean id="emp" class="Bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="小老师ir"></property>
<property name="gender" value="女"></property>
<!--级联赋值-->
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="技术部"></property>
</bean>
<bean id="dept" class="Bean.Dept"></bean>
测试:
@Test
public void testEmp3(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Emp emp = (Emp)context.getBean("emp");
System.out.println(emp);//Bean.Emp@757942a1
emp.add();//小老师ir::女::Dept{dname='技术部'}
}
注意:此种方法中,
Emp类中必须有getDept( )方法

步骤:
① 创建类,定义数组、list、map、set 类型属性,生成对应 set 方法
Stu类
public class Stu {
//1 数组类型属性
private String[] courses;
//2 list集合类型属性
private List<String> list;
//3 map集合类型属性
private Map<String,String> maps;
//4 set集合类型属性
private Set<String> sets;
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
@Override
public String toString() {
return "Stu{" +
"courses=" + Arrays.toString(courses) +
", list=" + list +
", maps=" + maps +
", sets=" + sets +
'}';
}
}
② 在 spring 配置文件进行配置
<bean id="student" class="collectiontest.Stu">
<!--注入数组属性-->
<property name="courses">
<array >
<value>Java</value>
<value>C++</value>
</array>
</property>
<!--注入list属性-->
<property name="list">
<list>
<value>Python</value>
<value>Go</value>
</list>
</property>
<!--注入map属性-->
<property name="maps">
<map>
<entry key="小老师ir" value="Java"></entry>
<entry key="小老师ir" value="C++"></entry>
</map>
</property>
<!--注入set属性-->
<property name="sets">
<set>
<value>喜羊羊</value>
<value>美羊羊</value>
</set>
</property>
</bean>
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Stu student = context.getBean("student",Stu.class);
System.out.println(student);//Stu{courses=[Java, C++], list=[Python, Go], maps={小老师ir=C++}, sets=[喜羊羊, 美羊羊]}
}
Stu类
public class Stu {
//1 数组类型属性
private String[] courses;
//2 list集合类型属性
private List<String> list;
//3 map集合类型属性
private Map<String,String> maps;
//4 set集合类型属性
private Set<String> sets;
//学生所学多门课程
private List<Course> courseList;
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
@Override
public String toString() {
return "Stu{" +
"courses=" + Arrays.toString(courses) +
", list=" + list +
", maps=" + maps +
", sets=" + sets +
", courseList=" + courseList +
'}';
}
}
Course类
//课程类
public class Course {
private String cname; //课程名称
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
在 spring 配置文件进行配置
<!--创建多个 course 对象-->
<bean id="course1" class="collectiontest.Course">
<property name="cname" value="英语课"></property>
</bean>
<bean id="course2" class="collectiontest.Course">
<property name="cname" value="语文课"></property>
</bean>
<bean id="course3" class="collectiontest.Course">
<property name="cname" value="数学课"></property>
</bean>
<!--创建Stu对象-->
<bean id="student1" class="collectiontest.Stu">
<!--注入 list 集合类型,值是对象-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
<ref bean="course3"></ref>
</list>
</property>
</bean>
测试
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
Stu student = context.getBean("student1",Stu.class);
System.out.println(student);//Stu{courses=null, list=null, maps=null, sets=null, courseList=[Course{cname='英语课'}, Course{cname='语文课'}, Course{cname='数学课'}]}
}
Book类·
public class Book {
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return "Book{" +
"list=" + list +
'}';
}
}
步骤:
① 在 spring 配置文件中引入名称空间 util

② 在 spring 配置文件进行配置,使用 util 标签完成 list 集合注入提取
<!--1 提取list集合类型属性注入-->
<util:list id="bookList">
<value>java</value>
<value>c++</value>
<value>python</value>
</util:list>
<!--2 提取list集合类型属性注入使用-->
<bean id="book" class="collectiontest.Book" scope="prototype">
<property name="list" ref="bookList"></property>
</bean>
测试
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Book book= context.getBean("book", Book.class);
System.out.println(book);//Book{list=[java, c++, python]}
}
⭕ 在 Spring 里面,设置创建 bean 实例是单实例还是多实例 ?
⭕在 Spring 里面,默认情况下,bean 是单实例对象
Book类
public class Book {
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
}
在 spring 配置文件进行配置
<!--1 提取list集合类型属性注入-->
<util:list id="bookList">
<value>java</value>
<value>c++</value>
<value>python</value>
</util:list>
<!--2 提取list集合类型属性注入使用-->
<bean id="book" class="collectiontest.Book" >
<property name="list" ref="bookList"></property>
</bean>
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Book book1= context.getBean("book", Book.class);
Book book2= context.getBean("book", Book.class);
System.out.println(book1);//collectiontest.Book@27d415d9
System.out.println(book2);//collectiontest.Book@27d415d9
}
由以上测试输出结果可知,创建的两个book对象地址相同,即为其实是同一个对象
⭕如何设置单实例还是多实例
● 在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
● scope 属性值,其中有两个常见的词
- 第一个值,默认值,singleton,表示是单实例对象
- 第二个值prototype,表示是多实例对象 Book类与如上相同
在 spring 配置文件进行配置
<!--1 提取list集合类型属性注入-->
<util:list id="bookList">
<value>java</value>
<value>c++</value>
<value>python</value>
</util:list>
<!--2 提取list集合类型属性注入使用-->
<bean id="book" class="collectiontest.Book" scope="prototype">
<property name="list" ref="bookList"></property>y
</bean>
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Book book1= context.getBean("book", Book.class);
Book book2= context.getBean("book", Book.class);
System.out.println(book1);//collectiontest.Book@27d415d9
System.out.println(book2);//collectiontest.Book@5c18298f
}
由以上测试输出结果可知,创建的两个book对象地址不相同,即为是两个对象
⭕ singleton 和 prototype 区别
● singleton 单实例,prototype 多实例
● 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象
● 设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,而是在调用getBean 方法时候创建多实例对象
⭕ 生命周期:从对象创建到对象销毁的过程
⭕ bean 生命周期
(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用set 方法)
(3)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(4)bean 可以使用了(对象获取到了)
(5)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
⭕ 演示 bean 生命周期
Order类
public class Order {
private String name;
public Order() {
System.out.println("第一步:执行无参构造器创建对象");
}
public void setName(String name) {
this.name = name;
System.out.println("第二步:调用set()方法设置属性值");
}
public void initMethod(){
System.out.println("第三步:执行初始化方法");
}
public void destroyMethod(){
System.out.println("第五步:执行销毁的方法");
}
}
在 spring 配置文件进行配置
<bean id="order" class="collectiontest.Order" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="电脑订单"></property>
</bean>
测试:
@Test
public void test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Order order= context.getBean("order", Order.class);
System.out.println("第四步:获取创建 bean 实例对象");
System.out.println(order);
context.close();
// 第一步:执行无参构造器创建对象
// 第二步:调用set()方法设置属性值
// 第三步:执行初始化方法
// 第四步:获取创建 bean 实例对象
// collectiontest.Order@4a87761d
// 第五步:执行销毁的方法
}
⭕ bean 的后置处理器,bean 生命周期有七步
(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)把bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递 bean 后置处理器的方法postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean 的销毁的方法(需要进行配置销毁的方法)
⭕ 演示添加后置处理器效果
(1)创建类,实现接口 BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
}
}
在 spring 配置文件进行配置
<?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">
<!--配置order对象-->
<bean id="order" class="bean.Order" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="电脑订单"></property>
</bean>
<!--配置后置处理器-->
<bean id="mybeanpost" class="bean.MyBeanPost"></bean>
</beans>
测试:
@Test
public void test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Order order= context.getBean("order", Order.class);
System.out.println("第四步:获取对象");
System.out.println(order);
context.close();
// 第一步:执行无参构造器创建对象
// 第二步:调用set()方法设置属性值
// 在初始化之前执行的方法
// 第三步:执行初始化方法
// 在初始化之后执行的方法
// 第四步:获取对象
// bean.Order@37374a5e
// 第五步:执行销毁的方法
}
⭕ 什么是自动装配?
根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入
① bean 标签属性 autowire,配置自动装配
② autowire 属性常用两个值:
- byName:根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
- byType :根据属性类型注入
⭕演示自动装配过程
● 根据属性名称自动注入
Dept类
public class Dept {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dept{" +
"name='" + name + '\'' +
'}';
}
}
Emp类
public class Emp {
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"dept=" + dept +
'}';
}
}
在 spring 配置文件进行配置
<!--创建emp对象-->
<!--使用自动装配方式注入属性:通过属性名的方式-->
<bean id="emp" class="bean.Emp" autowire="byName">
<!--使用手动方式注入属性-->
<!-- <property name="dept" ref="dept"></property>-->
</bean>
<!--创建dept对象-->
<bean id="dept" class="bean.Dept">
<property name="name" value="技术部"></property>
</bean>
测试:
@Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
Emp emp = context.getBean("emp", Emp.class);
System.out.println(emp);//Emp{dept=Dept{name='技术部'}}
}
● 根据属性类型自动注入
<!--创建emp对象-->
<!--使用自动装配方式注入属性:通过属性类型的方式-->
<bean id="emp" class="bean.Emp" autowire="byType">
<!--使用手动方式注入属性-->
<!-- <property name="dept" ref="dept"></property>-->
</bean>
<!--创建dept对象-->
<bean id="dept" class="bean.Dept">
<property name="name" value="技术部"></property>
</bean>
测试:
@Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
Emp emp = context.getBean("emp", Emp.class);
System.out.println(emp);//Emp{dept=Dept{name='技术部'}}
}
注意:通过属性类型的方式自动装配时,同一类型不能有多个bean对象,否则会报错
⭕ 直接配置数据库信息
① 引入德鲁伊连接池依赖 jar 包
② 配置德鲁伊连接池
<!--创建数据库连接池对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--直接对连接池进行属性配置-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/userDb"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
⭕ 引入外部属性文件配置数据库连接池
(1)创建外部属性文件,properties 格式文件,写数据库信息
jdbc.properties
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root
(2)把外部 properties 属性文件引入到 spring 配置文件中
① 引入 context 名称空间

② 在 spring 配置文件使用标签引入外部属性文件
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--创建数据库连接池对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--对连接池进行属性配置-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/userDb"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
- 普通 bean:在配置文件中定义 bean 类型就是返回类型
- 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
步骤:
① 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
② 实现口里面的方法,在实现的方法中定义返回的bean 类型
Course类
public class Course {
private String cname; //课程名称
public void setCname(String cname) {
this.cname = cname;
}
public String getCname(){
return this.cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
public class MyBean implements FactoryBean<Course> {
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("Java");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
}
③ 在 spring 配置文件进行配置
<!--创建MyBean对象-->
<bean id="mybean" class="factorybean.MyBean"></bean>
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Course course= context.getBean("mybean", Course.class);
System.out.println(course.getCname());//Java
}
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt