当前位置: 首页 > 科技观察

Spring是怎么区分这么多bean的呢?

时间:2023-03-12 16:39:55 科技观察

万物皆有名,一个人可能有多个名字,比如朱元璋,朱重八就能分得清。豆类也是如此。本文主要探讨如何在spring中区分各个bean。主要是方法,其核心原理主要是在bean的生命周期中进行管理。主要通过以下三个:1.XML中的name或id属性第一步:创建User类publicclassUser{privateStringname;publicUser(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicvoidhello(){System.out.println("name:"+"helloworld");}}User是一个bean,它定义了一个hello方法。第二步:创建spring.xml文件,在xml文件中配置bean我在resource目录下新建了一个META-INF目录用来存放spring.xml文件。id在这个文件中用来区分不同的bean。第三步:验证publicclassMain{publicstaticvoidmain(String[]args){StringxmlPath="META-INF/spring.xml";ApplicationContextapplicationContext=newClassPathXmlApplicationContext(xmlPath);//从spring容器用户获取Useruser=(User)applicationContext.getBean("");user.hello();}}你可以在控制台看到结果。图2.通过注解声明Bean注解:(1)@Component组件没有明确的作用。(2)@Service用在业务逻辑层(Service层)。(3)@Repository用于数据访问层(dao层)。(4)@Controller用于表现层。默认情况下,他们不直接指定bean的名字,所以bean的名字是spring自动生成的。bean名称生成规则如下:(1)如果类的simpleName大于1个字符且第二个字符为大写字母,则simpleName为bean名称,(2)如果类的simpleName为第一个字符或第二个字符为小写,将第一个字母转为小写作为bean名称。比如“FooBah”的bean名变成了“fooBah”,“X”变成了“x”,“URL”还是“URL”。下面通过例子演示一波:注意:如果不同包下有两个同名的类,并且两个类都声明为springbean,这时候就会发生冲突。因为bean的名称是bean的唯一标识,所以不允许重复。第一步:创建UserServicepublicclassUserService{publicvoidhello(){System.out.println("helloworld");}}第二步:创建config@Configuration@ComponentScan("com.example.demo.beam")publicclassJavaConfig{}第三步:验证publicclassMain{publicstaticvoidmain(String[]args){AnnotationConfigApplicationContextcontext=newAnnotationConfigApplicationContext(JavaConfig.class);UserServiceteacherService=(UserService)context.getBean("userService");teacherService.hello();context.close();}}即可验证时看到获取bean时输入的名字是userService。看结果3、Java配置@Bean注解声明的方法名就是放入spring容器的bean的名字。Java配置是通过@Configuration和@Bean来实现的。@Configuration声明当前类是一个配置类,相当于一个Spring的配置xml文件。@Bean注解在方法上,声明当前方法的返回值是一个Bean。案例验证:第1步:更改JavaConfig@Configuration@ComponentScan("com.example.demo.beam")publicclassJavaConfig{@BeanpublicUserServicegetStudentService(){UserServiceuserService=newUserService();returnuserService;}}这时候bean注解到method,根据上面的定义,此时的bean是返回类型UserService,所以返回的结果也是这个。第二步:根据上面的publicclassMain{publicstaticvoidmain(String[]args){AnnotationConfigApplicationContext=newAnnotationConfigApplicationContext(JavaConfig.class);UserServiceteacherService=(UserService)context.getBean("userService");teacherService.hello();context进行测试。close();}}在Main测试环境中,我们仍然使用userService来获取和测试bean。结果保持不变。其他方法有待补充。本文转载自微信公众号“愚公要移山”,可关注下方二维码。转载本文请联系愚公移山公众号。