一、Spring Core
Spring容器
作用:用来创建并管理bean
bean实例的创建:使用反射的方式,创建bean的实例(xml配置文件里面体现的)
<!--这里相当于是通过类的全限定名用反射创建一个实例对象
MessageController MessageControllerBean=Class.forName("com.my.web.controller.MessageController").newInstance();
-->
<bean id="MessageControllerBean" class="com.my.web.controller.MessageController">
容器的设计:使用的是工厂模式(BeanFactory),获得bean的方法Object getBean(String var1) ,它是在一个public interface BeanFactory中定义的方法
管理:容器中的每个bean都是spring容器默认按照单例方式管理的,可以通过设置
<bean id="MessageServiceImplBean"class="com.my.web.service.impl.MessageServiceImpl" scope="prototype">
</bean><!--更改为每次获取时创建不同的实例-->
ApplicationContext(一个应用的上下文,也就是全局的,这是一个接口),是一个顶层容器
1.ApplicationContext context=new ClassPathXmlApplicationContext("springConfig2.xml");
2.ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("springConfig.xml");//这里的构造方法里面的参数指的是
在类路径下(src)的配置文件(xxx-config.xml);若是采用注解的方式,需要在配置文件里面使用 <context:component-scan base-package="com.my">
</context:component-scan>//完成类的扫描工作
//基于注解的spring容器加载方式,不需要配置文件就行,给一个根包就可以了
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext("com.my");
IOC或者DI
IOC:Inverse Of Control(控制反转)
DI:Dependency Injection(依赖注入)
思想:对于传统的方式来讲,当我们在一个类(A)中要使用另一个类(B)的方法时,那么我们会在A类中通过new的方式创建出B类的实例,然后调用B类中的方法,这样的话类A与类B之间的耦合比较高,使我们所不期望的;那么现在我们将实例的创建交付给Spring容器来管理,这样可以降低类与类之间的耦合,是我们所期望的;那么由传统方式到Spring容器的转变就叫做IOC;在一个类(D)中要使用另一个类(E),我们可以通过Spring容器中的bean节点中有一个property属性来设置这两个类之间的关联关系,这就叫做DI。其实DI与IOC是一回事,只是从这两个方面去考虑的。
三种注入的方式
- 1.属性setter注入,注意在需要使用的地方加上属性的set方法属性的setter注入
<property name="service" ref="MessageServiceImplBean"></property>
- 2.构造注入(使用有参的构造方法进行注入)
<constructor-arg name="defaultMsg" value="默认的String用的是value属性来充当值"/>
<constructor-arg name="service" ref="MessageServiceImplBean"/>
- 3.接口注入(不常用)
注解
声明bean,也就是在一个类上面加上对应的注解使这个类被spring容器来管理
- @Component:指的是组件的意思,这是一个比较通用的,也就是不确定一个类的具体作用(充当控制器、业务层、DAO)使用它
- @Controller:指的是控制器组件,对于一个类若果它充当的是一个控制器,那么就可以用此组件。
- @Service:指的是一个业务组件,如果一个类要处理业务时那么就用此注解,可以设置一个指定的名称@Service(“userService”),然后在控制器中使用@Autowired与@Qualifier(“userService”)即可
- @Repository:本意是"仓库"的意思,指的是数据访问层组件,如果要将一个类设计为DAO层的类时,则可以使用它。
声明注入,也就是建立类与类之间依赖关系
-
Spring Framework
- @Autowired:自动装配(默认是按照类型自动装配),按照当前声明的接口类型,在容器中查找该名称对应的bean,进行自动注入(转配)。
- @Qualifier:按照bean的名称自动装配,与@Autowired注解配合使用。按照当前指定的bean名称,在容器中查找该名称对应的bean,进行自动转配。
-
Java标准注解
- @Resource:javax扩展包提供的注解,完成自动注入,默认是按照类型自动注入的,也可以使用name属性进行按照名称的自动注入, @Resource(name = “userService”)//这一个注解代表了上面两个的功能。