(1)方便解耦,简化开发。 (2)AOP编程的支持 (3)声明式事务的支持 (4)方便程序的支持 (5)方便集成各种优秀框架 (6)降低Java EE API的使用难度 (7)Java源码是经典的学习范例。
(1)IoC spring核心模块实现了IoC的功能,它将类与类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IoC容器负责依赖类之间的创建、拼接、管理、获取等工作。BeanFactory接口是spring框架的核心接口,它实现了容器许多核心的功能。 Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了i18n国际化、Bean生命周期控制、框架事件体系等功能。 (2)AOP AOP是进行横切逻辑编程的思想,它开拓了考虑问题的思路。 (3)数据访问与集成 (4)Web及远程操作 (5)Web及远程访问 (6)WebSocket
耦合:程序间的依赖关系 耦合包括: (1)类之间的依赖 (2)方法见的依赖 解耦:降低程序间的耦合关系 实际开发中:应该做到,编译器不依赖,运行时依赖 解耦的思路: 第一步:使用反射来创建对象,而避免使用new关键字 第二步:通过读取配置文件来获取要创建的对象全限定类名
beanfactory:一个创建bean对象的工厂
bean:在计算机英语中,有可重用组件的含义 javabean:用java语言编写的可重用组件。
它就是用于创建service和dao对象的
第一步:需要一个配置文件来配置我们的service和dao 配置的内容:唯一标识 = 全限定类名(key = value) 第二步:通过读取配置文件中配置的内容,反射创建对象 配置文件可以是xml也可以是properties
IOC就是控制反转,控制反转把创建对象的权利交给框架,是框架的重要特征。
ApplicationContext的三个常用实现类: ClassPathXmlApplicationContext 它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。 FileSystemXmlApplicationContext 它可以加载磁盘任意路径下的配置文件(必须有访问权限) AnnotationConfigAoolicationContext 它是用于读取注解创建容器的。
核心容器的两个接口引发的问题: ApplicationContext: (单例对象使用) 它在构建容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件就马上创建配置文件的配置对象 BeanFactory: (多例对象使用) 它在创建核心容器时,创建对象采取的策略是延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象
spring对bean的管理细节 1,创建bean的三种方式 2,bean对象的作用范围 3,bean对象的生命周期
第一种方式:使用默认构造函数创建。 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。 采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
<bean id="accountService" class="com.star.service.impl.AccountServiceImpl"></bean>第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
<bean id="instanceFactory" class="com.star.factory.InstanceFactory"></bean> <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>第三种方式:使用工厂中的静态方法创建对象(使用某个类的静态方法创建对象,并存入spring容器)
<bean id="accountService" class="com.star.factory.StaticFactory" factory-method="getAccountService"></bean>bean标签的scope属性: 作用:用于指定bean的作用范围 取值:
singleton(单例的 也是默认值)prototype(多例的)request(作用于web应用的请求范围)session(作用于web应用的会话范围)global-session(作用于集群环境的会话范围(全局会话范围),当不是集群环境时,他就是session)IOC的作用: 降低程序之间的耦合
依赖关系的管理:都交给spring来维护 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明 依赖关系的维护:就称之为依赖注入。
依赖注入能注入的数据有三类:
基本数据类型和string类其他bean类型(在配置文件中或者注解配置过的bean)复杂类型/集合类型注入的方式有三种:
使用构造函数提供使用set方法提供使用注解提供以上三个用于指定给构造函数中哪个参数赋值
value:用于给基本类型或string类型的提供数据ref:用于指定其他的bean类型数据。它指的就是在spring的ioc核心容器中出现过的bean对象优势:在获取bean对象时,注入数据时必须的操作,否则对象无法创建成功 弊端:改变了对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供
<bean id="accountService" class="com.star.service.impl.AccountServiceImpl" scope="prototype"> <constructor-arg name="name" value="test"></constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> <constructor-arg name="birthday" ref="now"></constructor-arg> </bean> <!--构造一个日期对象--> <bean id="now" class="java.util.Date"></bean>优势:创建对象时没有明确的限制,可以直接使用默认的构造函数 弊端:如果有某个成员必须有值,则获取对象时有可能set方法没有执行
注解的作用就和xml配置文件中编写一个be’an标签实现的功能是一样的
以上三个注解他们的作用和属性与component是一模一样,他们三个是spring框架为我们提供的明确的三层使用的注解,使我们的三层对象更加清晰
他们的作用就和xml配置文件中的bean标签中写一个property的作用是一样的 @Autowired:
作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。如果ioc容器中没有任何bean的类型和要注入的类型匹配,则报错。如果ioc容器中有多个类型匹配时,则根据变量名匹配id,匹配不到则报错出现位置:可以是变量上,也可以是方法上细节:在使用注解注入时,set方法就不是必须的了@Qualifier:
作用:在按照类中注入的基础上再按照名称注入,他在给类成员注入时不能单独使用,但是在给方法参数注入时可以属性:value:用于指定注入bean的id@Resource
作用:直接按照bean的id注入。它可以独立使用属性:name:用于指定bean的id以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现; 另外,集合类型的注入只能通过xml实现
@Value
作用:用于注入基本类型和String类型的数据属性:value:用于指定数据的值。它可以使用spring中的SpEL(也就是spring的el表达式)他们的作用就和xml配置文件中的bean标签中使用scope属性实现的功能是一样的 @Scope
作用:用于指定bean的作用范围属性:value:指定范围的取值。常用取值:singleton prototype他们的作用就和bean标签中使用init-method和destroy-method的作用是一样的 @PreDestroy
作用:用于指定销毁方法@PostConstruct
作用:用于指定初始化方法