威海网站建设公司排名,新网站如何做排名,dede自动生成网站地图,wordpress图标svg更改我们希望Spring框架帮忙管理Bean实例#xff0c;以便得到框架所带来的种种功能#xff0c;例如依赖注入等。将一个类纳入Spring容器管理的方式有几种#xff0c;它们可以解决在不同场景下创建实例的需求。 XML配置文件声明 ?xml version1.0 encoding… 我们希望Spring框架帮忙管理Bean实例以便得到框架所带来的种种功能例如依赖注入等。将一个类纳入Spring容器管理的方式有几种它们可以解决在不同场景下创建实例的需求。 XML配置文件声明 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdbean nametestService classcom.example.demo.test.TestService/
/beans需要指定配置文件来初始化Spring容器ApplicationContext context new ClassPathXmlApplicationContext(services.xml);这种方式已经过时了在历史项目中可能还有身影。在配置文件中还可对实例化过程进行一些调整例如可延迟到实例使用时才真正初始化延时加载、实例作用域等。 在目标类头上加注解 import org.springframework.stereotype.Service;
Service
public class TestService {
}目前大家普遍使用Spring boot可以很方便地在目标类上加注解框架使用AnnotationConfigApplicationContext扫描类识别到注解后将类进行初始化。默认只会扫描启动类的包目录你可以通过ComponentScan来配置其它包路径。那么使用哪些类才会被扫描到呢 只要该注解类中有增加org.springframework.stereotype.Component元注解像上面的Service注解类头上就有。常见的有ControllerAdvice、Configuration、Controller、Repository、Service、Autowired、Resource和Component等。 通过编程方式 Configuration
public class TestConfiguration {Beanpublic TestService getTestService() {return new TestService();}
}这种方式可以让开发者更容易的控制Bean实例化过程例如可以从外部来源获取参数最终将类实例化。 获取ApplicationContext来构建 public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(AppStater.class, args);BeanDefinitionBuilder bdf BeanDefinitionBuilder.genericBeanDefinition(TestService.class);((DefaultListableBeanFactory) context.getAutowireCapableBeanFactory()).registerBeanDefinition(testService, bdf.getBeanDefinition());
}这种方式需要注意使用Bean的时机因为在Spring容器初始时并没有创建它所以这种方式也可以实现动态加载Bean。在实现类似插件这种机制时必不可少的就是动态加载在程序启动时并不知道将会实例化什么类等到运行过程中通过配置或其它外部源动态获取要实例化的类。 为了获取Spring容器一般会创建一个工具类方便开发者在代码任意位置就能拿到容器下面代码可以拿走即用。 package cn.com.example.app.commons.spring;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;/*** 以静态变量保存 Spring ApplicationContext可在任何代码任何地方任何时候取出ApplicationContext。** author tianmingxing mx.tianqq.com* date 2022-03-08*/
Component
Lazy(value false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {public static ApplicationContext ctx null;SuppressWarnings(unchecked)public static T T getBean(String name) {assertContextInjected();return (T) ctx.getBean(name);}public static T T getBean(ClassT clazz) {assertContextInjected();return ctx.getBean(clazz);}public static ApplicationContext getContext() {assertContextInjected();return ctx;}Overridepublic void destroy() throws Exception {ctx null;}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {ctx applicationContext;}
}除此之外还有一些方法采用框架的一些特性在过程中顺便完成实例初始化算是被动的做了这件事情。