Spring简介
- Spring Boot的目的在于创建和基于spring框架的项目。Spring Boot会选择 合适Spring子项目和第三番开源库进行整合。大部分Spring Boot应用只需要很少的配置就可以快速启动。
- Spring Boot基于 Spring 4.0诞生的,提供了一种快速使用Spring的方式。
Spring Boot特点
- 基于spring开发,入门更快。
- 可以独立运行,不依赖于服务器程序
- 直接嵌入Tomcat 或 Jetty服务器,不需要打包WAR文件
- 尽可能使用自动配置
- 提供了可以在生产中使用的功能,如性能指标、应用信息、应用健康
- 直接可以使用,通过修改默认值,无需xml文件
- 是大量项目的基础,如spring Cloud
– 使编码变得简单,使配置变得简单,使部署变得简单,使监控变得简单
Spring Boot 缺点
- 依赖太多
- 缺少服务的注册和发现
- 文档缺少
Spring Boot 应用常景
- Spring的应用的场景
- java web应用
- 微服务
Spring 简单入门
Spring是一个企业级开发框架,为了解决企业级项目(EJB)开发,过于复杂而创建的,框架的主要优势之一是分层架构,开发者可以自主选择框架。
Spring的核心是Ioc和AOP。 IOC是典型的工厂模式,通过工厂去注入对象,AOP是代理模式。IOC和AOP,把一个大系统分解成一个个低耦合,高内聚的模块。IOC是工厂模式,使用工厂去注入对象,AOP是动态代理模式。
spring的优点
* 方便解耦,简化开发
* Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
* AOP编程的支持
* Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
* 声明式事务的支持
* 只需要通过配置就可以完成对事务的管理,而无需手动编程
* 方便程序的测试
* Spring对Junit4支持,可以通过注解方便的测试Spring程序
* 方便集成各种优秀框架
* Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持
* 降低JavaEE API的使用难度
Spring出现的原因
解决企业级项目开发过于复杂尔创建的(使用EJB进行分布式应用开发,忍受重量级框架带来的种种麻烦)
IOC
IOC原理 静态工厂和实例工厂 传统开发中,需要对象时,通常由调用者来创建被调用这的实例,即对象时使用者自己new出来的。在spring中,创建对象的工作不再是由调用者负责,而是交给ioc容器完成,在推送给调用者,
这就是控制反转。
流程 ++ 加载spirng配置文件,成成ApplicationContext对象, 第二部,调用getBean。
—程序在加载xml时,对象已经出来,通过反射调用构造
bean是根据scope生成的, singleton单例,prototype原型,request请求,response
使用Spring创建装配Bean的方法
1> 使用Spring指定注解
- @Cmponent //使用时要在context中加入这个组件类 new Context(XXX.class)
//无法指定创建和销毁所指定的方法,无明确角色时使用
@Repository
//多用于装备Dao层的Bean
@Controller
//用于控制层
@Resource //JSR25注解
@Inject //需要额外导入 javax.Inext包 JSR 330
-----其他注解
使用@Autowired 自动装配 @Qualifier("") 别名 @Primary 冲突时,使用该注解所在的Bean
2>使用配置类
扫描创建Bean
- new AnnotationConfigApplicationContext(" 包名");
- 扫描器
声明类,使用 @ComponentScan(“com…”) @Configuration 装饰类体
new AnnotationConfigApplicationContext([声明的扫描器].class);
排除装配某个bean @ComponentScan(basePackage="",excludeFilter(type=,classes={}))
Spring4示例Spring使用(基于注解 )
App.java
main{
AnnotationConfigApplicatiionContext context = new AnnotationConfigApplicationContext(MyConfig.class);
//可以使用包扫描 Context("com.....")
context.getBean(MyBean.class); //根据类获取
contexnt.getBean("myBean"); //根据名字获取
context.getBean("&crateMyFactoryBean"); 根据名字获取工厂本身非创建出来的Bean
context.close();
}
MyConfig.java 配置类
@configuration //配置类注解
public class MyConfig{
@Bean(name="myBean") //实体类注解,相当于在xml中声明Bean
@Scope("prototype") //设置单例多例
public MyBean createMyBean(){
return new MyBean();
}
@Bean
public RunableFactoryBean crateMyFactoryBean(){
return new RunableFactoryBean();
}
@Bean
pulbic jeep createJeep(JeepFactory factory){ //将工厂注入进去,使用工厂的方法进行注册Bea
return factory.create();
}
}
-- 使用FactoryBean创建Bean
public class MyBeanFactoryBean implements FactoryBean<Bo>
getObejct(); //返回的对象
getObjectType(); //返回的类型
isSingel(); //返回是否单例
- 其他创建Bean的方法
(1)
[Bo] implements InitialzingBean,DisposableBean{
@override
afterPropertiesSet(){ //bean创建完成后执行一段方法
}
@Ovverride
public void destory() throws Exception{ //bean销毁执行的方法
}
}
(2)
@Bean(initMethod="init"destoryMethod=“destory”)
(3) 方法注解 @PostContrust @preDestory
Spring扩展分析
DI
- 在类注入ApplicationContext的方法
1. @Autowired
ApplicationContext applicationContext;
2. public class XXX implements ApplicationContextAware{ //实现接口,重写方法
ApplicationContext applicationiContext ;
public void setApplicationContext(ApplicationContext applicationiContext){
}
}
实现方法:BeanPostProcessor 的 postProcessBeforeInitialization postProcessAfterInitialization 方法。 在 创建bean之前和bean之后调用的方法。
postProcessBeforeInitialization //是在bean依赖装配(属性设置完)完成之后触发
postProcessAfterInitialization //是在bean init方法执行之后触发的
返回null否则从容器中获取不到。
– 用法
可用于回调,返回代理对象
- public class XXX{ //使用spring 4.3 的特性,在构造中自动注入
private ApplicationContext applicationContext;
public XXX(ApplicationContext applicationContext){
this.applicationContext = applicationContext;
}
}
局限性:1. 类只能有一个构造函数(多个构造函数,只会找默认的无参构造函数)
2. 构造函数的对象必须在spring中有。
- Spring容器初始化之前的扩展
类: BeanFactoryPostProcessor
使用方法: class XXX implements BeanFactoryPostProcessor{
@Override
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory){
//初始化完成,最先执行的代码。只触发一次
}
}
- 手动向Spring容器中注入bean的扩展
实现1.
实现2. 其中bean的构造用SpringBuilder