核心容器支持函数式风格GenericApplicationContext举例,即将自己new的对象,交给spring容器进行管理:
User.java类:在该类的主函数中,自己通过new创建的对象,Spring 容器并不知道,所以无法对该对象进行管理,需要将该对象在Spring中进行注册。而注解方式和xml方式,Spring容器都知道。
package test;
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
User user=new User(1,"张三");//自己通过new创建的对象,Spring 容器并不知道
//而注解方式和xml方式,Spring容器都知道
}
}
package test;
import cn.imu.config.txConfig;
import cn.imu.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
public class Test1 {
//函数式风格创建对象,交给Spring进行管理
@Test
public void testGenericApplicationContext(){
//1.创建GenericApplicationContext对象
GenericApplicationContext context=new GenericApplicationContext();
//2.调用context的方法对象注册
context.refresh();//刷新
//3.将new出来的User对象在Spring容器中完成注册
context.registerBean(User.class,()->new User(1,"张三"));//()->new User()为lamda表达式
//4.获取在Spring5中注册的对象
User user=(User)context.getBean("user");
System.out.println(user);
}
}
此时运行时,发现:
这是由于没有指定名字,所以无法像xml方式、注解方式那样通过名字,使用getbean()直接获取对象
解决方案1:写上全路径,即包名.路径名
User user=(User)context.getBean("test.User");
运行结果如图:
解决方案2:在注册时,指定注册名,这里指定为user1.
context.registerBean("user1",User.class,()->new User(1,"张三"));//()->new User()为lamda表达式
//4.获取在Spring5中注册的对象
//User user=(User)context.getBean("test.User");
User user=(User)context.getBean("user1");
System.out.println(user);
运行结果如图: