框架——重复代码的集合。提高开发效率,缩短开发周期。
Spring——整合现阶段所有的主流框架,即:负责所有框架的调度和整合。
Spring是轻量级的框架(资源占用小、容器依赖性小),是开源的。
Spring IOC——控制反转,将对象创建的权利交给Spring容器来完成,开发者无需关注对象的创建过程。即:不用自己new对象,从Spring容器里getXXX。
IOC步骤:
1.导入Spring相关jar包
2.创建实体类
3.编写Spring的配置文件(配置文件的头,编写类的对应关系)
默认配置文件名称:applicationContext.xml
4.创建Spring容器
Spring中如何创建对象?
可以通过class属性的值通过反射调用创建对象。Spring容器存储对象的方式就是一个Map(key, value),key就是bean的id,value就是对象。
5.从容器中获取对象,对象调用方法,完成功能。
容器中对象的获取方式:bean id(推荐) / 类型(类型重复会报错)
别名标签——bean id如果不同,可以使用alias标签。
对象的创建方式
1.构造方法创建对象——使用频率最高
如果构造方法重载,那么一定要加无参构造,如果没有无参构造(default constructor),那么默认的对象创建方式必然出错。
2.静态工厂创建对象——static
Spring的执行过程:
在Spring容器启动时,先会加载applicationContext.xml这个配置文件,根据每一个bean创建对象,解析到factory-method属性时,先会到class中找到该方法,之后直接调用执行。执行之后创建出来Calender对象。
3.实例工厂
实例工厂创建对象——先创建工厂对象,然后调用工厂对象的getCalendar方法创建Calendar对象,交给Spring。
4.Spring工厂
public class SpringFactory implements FactoryBean
当实现接口后,Spring容器在启动时就会自动调用getObject()创建对象。
Spring对象创建过程
当Spring容器启动的时候,先会加载applicationContext.xml,按行解析,遇到每一个bean都会为这个bean创建对象,然会存入map中,直到整个xml配置文件解析完成,Spring容器启动成功。在容器启动完成以后,才能为用户提供服务。
Spring创建对象的单例和多例
默认条件下,Spring创建对象默认都是单例的,scope="singleton"时也是单例的。
当scope属性为prototype时,对象是多例的。
对象的懒加载问题
关于Spring Bean创建的优化——在用户需要调用对象的时候,对象才会被创建出来。
懒加载的实现:
lazy-init="default"和默认不写时,懒加载不生效
lazy-init="false" 懒加载不生效
lazy-init="true" 懒加载生效
当对象的创建形式为多例时,所有对象的创建都是懒加载的。
Spring容器对于多例对象,只管创建,其他都不管。
DI依赖注入
1.set注入——属性的注入,必须添加set方法
执行过程:Spring会找到所有的set方法,找到setName---(变形)--->name值与
set复杂类型的赋值
通过set注入方式可以为复杂类型赋值list、set、map、properties
2.构造器注入
如果对象创建时,使用构造方法进行注入,则可以不写无参构造。
使用构造方法进行注入时需要注意:
尽量使用index进行赋值;参数的个数一定保证参数匹配。
parent属性:
在Spring容器中创建时,如果有子父级关系,需要通过parent属性指明,这样Spring容器在创建对象时,帮助维护子父级关系。
初始化——销毁方法
init-method="init" destory-method="destory"
Spring容器可以直接调用初始化和销毁方法,需要用户指明方法名称即可。
autowire属性:
autowire可以简化xml配置,能够做到自动的装配,有两种装配模式:
1. byName
首先回查找所有的set方法setCat(Cat cat)--->去掉set并把首字母变小写--->cat--->与bean中的id进行比较,如果能够匹配,则能正确注入。如果匹配不到,则注入失败容器也不会报错。
2. byType
setCat(Cat cat)--->去掉set把首字符小写--->cat--->找到对应的类型(包名.类名)--->然后与bean中的class进行匹配,如果匹配成功则注入。
全局autowire
如果当前bean中配置了autowire则按照bean中配置的为准。
注解形式简化配置
引入头文件
1.属性注解
@Autowired
有两种注入方式,通过匹配属性的名称与bean中的id匹配,如果匹配成功则注入。如果匹配不成功则报错。
按照指定的ID匹配
@Autowired
@Qualifier(value="catA")
如果想实现按照ID匹配 则必须借助@Qualifier(value="catA")注解才能完成。
@Resource
@Resource注解的作用,其实就是@Autowired和@Qualifier(value="catA")的一个
增强版。使用一个注解就能够完成 按属性名称匹配,按属性类型匹配,按照
执行的ID匹配。
类的注解:
1.开启包扫描
2.使用@component
为需要创建对象的类 添加@Component注解,那么在spring容器启动时,先按
照包扫描给定的包进行扫描,当扫描到@Component注解的类时就会为当前的
这个类创建对象。在创建对象的过程中如果需要属性注入,则一并注入,将
生成的对象存放到了MAP中。Map中的Key就是当前类名首字母小写。
:ID的自动生成规则
当第二个字母大写 则 生成的ID就是类名Person,如果第二个字母小写 则首字
母小写。
:可以实现BeanNameAware接口
查看当前bean的id
:@Component(value="China") 指定bean的ID
:同类型的注解
@Scope(value="prototype") //对象的多例
@Lazy(value=false) //懒加载 失效
@PostConstruct //初始化方法
@PreDestroy //销毁方法
Spring为程序分层做了不同的注解:
1web @Controller
2service @Service
3dao @Repository
以上三个注解的作用和@Component一样,只是为了软件分层而设计的,方便程
序员阅读。
引入外部配置文件
1.导入外部配置文件
2.通过${配置文件的key} 能够得到value值
当Spring容器加载外部文件时会将key和value保存到Spring容器中
之后通过${XXX}可以动态的获取值。
使用场景:
配置数据库的数据源时使用
Driver url username passwrod
通过注解为基本类型赋值:
@Value(XXXX)
如果给复杂类型赋值 需要引入util头文件
xml中为list赋值:
值注入:
面向接口编程:
通过实现类实现接口的方式形成了接口与实现类的组合。在编程中通常属性的类
型都是接口类型。这样做的好处是能够实现松耦合。这种编程方式叫做面向接口
编程。
面向接口编程的好处是能够随意切换具体的实现类,而不用修改任何代码。
Spring IOC和DI和面向接口编程的意义
使用Spring的IOC、DI和面向接口编程,这样的代码结构可以做到最大程度的松耦合。
单元测试:必须是public / 方法的返回值必须是void / 必须添加@Test注解
Spring的头文件的生成方式
1.copy
2.通过约束文件自动生成——schema/DTD(有next点next)
右键New-Wizards:xml-XML (Basic Templates)-Create XML file from an XML schema file-Select XML Catalog entry-Select Root Element(Root Element/Prefix)-New Template(Name/Patterns)-OK
3.导入约束文件
步骤:
Window-Preferences-XML-XML Catalog-Add-Catalog Entry-Location(.xsd文件)-Key(.xsd)
导入约束的效果,能够实现在没有网的条件下,所有的标签能够自动提示。