Spring:就是一个容器,管理程序中的所有对象(bean),可以用他来管理整个应用。
ApplicationContext和BeanFactory的区别
ApplicationContext:容器初始化的时候,会创建所有Bean的对象
优点:响应更快
缺点:占用系统(CPU,内存)
BeanFactory:容器初始化的时候,不会创建所有Bean的对象,程序真正获取对象才创建
优点:不会过多的占用资源
缺点:响应跟慢
在spring框架的配置文件ApplicationContext.xml文件中定义各种bean,通过ApplicationContext对象和BeanFactory对象来获取Bean对象,也就是获取类的实体(对象)。
applicationContext.xml配置文件中要指明扫描什么位置的文件;位置是包的位置
<context:component-scan base-package="com.dgh,com.dgh2" />如果有多个包,用逗号隔开即可。
扫描的包定义好了之后,就不需要定义bean了,只需要使用注解标明需要注入spring容器中的类即可,项目启动时,spring会去指定的包下面扫描,有注解的,就会以bean 的形式注入自己容器中。
常用注解:
@Autowired 自动装配,默认按照类型去匹配bean,是用来注解一个类内部的其他类;假如一个接口被两个类实现了,此时a类的成员包括了该接口,那么使用@Autowired来注解,出问题了,到底注入该接口的哪个实现类呢?所以为了明确,需要 @Qualifier("实现类的名字") 注解来标明。
@Service 标明需要注入spring容器的类。默认bean的id为类的名字(小写),也可以@Service("指定名字")
@Controller 标明controller层的类。
@Repository 标明数据访问层的类。
@Value 用于标记类的成员变量的初始化值。
例如有个a类
@Service
class a{
@Value("hello")
String str;
}
ApplicationContext ac=new ClassPathXmlApplicationContext("test1/applicationContext.xml");
a www=(a)ac.getBean("a");
System.out.println(www.str);
就可以打印出hello了。
@AutoConfigureBefore :此注解会指定一个或多个类,比如 @AutoConfigureBefore(AA.class),或者 @AutoConfigureBefore(name = {"AA.class", "BB.class"}),当此注解作用于某个类时,表示AA 会在该类的 bean 初始化之后,(AA,BB)会在之前。
@AutoConfigureAfter:同理 @AutoConfigureBefore。
@Role:没有任何实质作用,仅标识一个 bean 的类型,一共有 3 种类型,由 BeanDefinition 接口提供(ROLE_APPLICATION = 0,ROLE_SUPPORT = 1, ROLE_INFRASTRUCTURE = 2)