今天内容:配置maven 搭建springboot项目 约定大于配置 IOC DI 常用注解 springbean的作用域 springbean的生命周期
Springboot
创建springboot项目
maven项目添加springboot变成的springboot项目
具体步骤参考:http://t.csdnimg.cn/2NTuK与http://t.csdnimg.cn/nQp9T
约定大于配置
也可以叫做约定优于配置,也称作按约定编程,是一种软件设计范式,指在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。例如注解就是约定,直接使用就行,没特殊要求就不用配置代码实现。
IOC
IOC==控制反转:容器和代码之间的控制权反转,代码中不需要明文调用来得到对象,只需要声明该类需要什么类型的对象即可
在项目运行阶段,程序中需要很多对象来完成相关业务,springboot提供了很多注解标注类,,让spring管理这些类的对象的生命周期。如:
@Controller(前台控制接收) 返回地址信息
@RestController 直接返回给客户端
@Service(业务类)
@Repository(Dao数据访问数据库)
@Component(其他功能类)
@Bean(指示一个方法生成一个bean)
spring提供了IOC的方式方便获取该对象:
package com.easy.common;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
public class TestA {
//面试题
//spring Bean的作用域//@Scope(value= "")
//singleton 单例模式 一个对象 默认
//prototype 原型模式 每次使用类都需要一个新的对象
//request web项目中请求作用域 每一次请求都会创建一个新的对象中 要求使用的本类的类也要设置
//session 每次会话(从访问服务器到结束)都会创建一个新的对象,下线或者默认30分钟没有动作就失效
//GlobalSession 全局的
public void test() {
System.out.println(this);
System.out.println("test method");
}
}
package com.easy.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.easy.common.TestA;
@Controller
public class EasyAController {
@Autowired
TestA testa;
@RequestMapping("testa")
public String testA() {
testa.test();
return "EasyA method";
}
}
DI
依赖注入DI 通过识别关系注入依赖对象
package com.easy.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.easy.common.TestA;
import com.easy.service.EasyService;
@RestController
public class EasyController {
//该类中需要EasyService类的对象
//在这个类中只需要声明依赖EasyService这个类就行
//不需要通过代码获取EasyService类的对象
//依赖注入DI 通过识别关系注入依赖对象
//@Autowired告诉spring说明需要这个类的对象,spring自动注入
@Autowired
EasyService easyS;
@RequestMapping("testb")
@Autowired
public String testB(TestA testa) {
testa.test();
return "Easy method";
}
@RequestMapping("easya")
public String easya() {
System.out.println(easyS.toString());
return "new Service";
}
@RequestMapping("hello")
public String hello() {
return "孩子们我回来了!";
}
}
springbean的作用域
在Spring框架中,bean的作用域决定了bean的生命周期和Spring容器如何创建bean实例。以下是Spring支持的主要bean作用域:
1. singleton(单例):
默认作用域。对于在Spring容器中定义为singleton的bean,容器将只创建一个bean实例。无论多少次请求,总是返回同一个实例。
2. prototype(原型):
对于定义为prototype的bean,每次请求都会创建一个新的bean实例。
3. request:
每次HTTP请求都会创建一个新的bean,该bean仅在当前HTTP请求内有效。仅适用于Web应用程序中。
4. session:
每次HTTP会话都会创建一个新的bean,该bean仅在当前HTTP会话内有效。仅适用于Web应用程序中。(从访问服务器到结束;主动或被动下线 或者 默认30分钟没有动作就结束)
5. global Session:
在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。同样只有在Web应用中使用Spring时,该作用域才有效。
使用@Scope注解:
可以通过@Scope注解指定bean的作用域,例如:
@Controller
@Scope("prototype")
public class MyController {
// ...
}
springbean的生命周期
bean创建-->初始化-->销毁 的过程,bean的生命周期由容器进行管理,我们可以自定义bean的初始化和销毁方法来满足我们的需求,当容器在bean进行到当前生命周期的时候,来调用自定义的初始化和销毁方法。
1.Spring 对bean 进行实例化。
2.Spring 将值和bean的引用注入到bean对应的属性中。
3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name() 方法。 (实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)
4.如果bean 实现了BeanFactoryAware接口,Spring将调用setBeanFactory() 方法,将BeanFactory容器实例传入。 (实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext() 方法,将bean所在的应用上下文的引用传入进来。(作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入,而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory )
6.如果bean实现了BeanPostProcessor接口,Spring将调用它们postProcessBeforeInitialization() 方法 (作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)
7.如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用。
8.如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization() 方法。 (作用与6的一样,只不过6是在Bean初始化前执行的,而这个是在Bean初始化后执行的,时机不同 )
9.此时, bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。