# Springboot框架解析
# 1、对象及分层概念
- Entity:最常用的实体类,基本和数据表一一对应,一个实体一张表
- Bo:business object,业务对象,将业务逻辑封装为一个对象,通过调用dao方法,结合po或vo进行业务操作。
- Vo:value object,值对象,用于业务层之间传递数据,由new创建,gc回收,主要体现在视图的对象,对于一个WEB页面将整个页面的属性封装成一个对象,然后用一个VO对象在控制层与视图层进行传输交换。
- Po:persistant object,持久层对象,对应数据库中表的字段,一个Po对应数据库中的一条记录
- Dto:data transfer object,数据传输对象,接口间传递的数据封装
- Pojo:plian ordinary java object,简单无规则java对象,最基本的Java Bean只有属性加上get和set方法,可以转换为Po,Dto,Vo
- Dao:data access object,数据访问对象,负责持久层的操作,主要用来封装数据的访问,注意不是对数据库的访问
- Controller:控制层,业务层与视图层打交道的中间层,负责传输vo对象和调用bo对象,负责视图层请求的数据处理后响应给视图层。
- View:视图层,由静态资源、jsp等文件形成
- Assembler:组装类,对象转换
相关思想:
- 依赖倒置:不为基础层依赖领域层,是基础层和领域层互相不依赖,而是共同依赖一组抽象接口
- DDD思想及充血和贫血模式 (opens new window)
# 2、spring mvc:controller接口
- /src/main/
- java/com.icbc.hz1.inforisk/rule
- common: RuleConstant.java //常量定义
- controller:LinkCtlRuleController.java //controller接口定义,调用service接口
- vo:LinkCtlRuleQueryVo.java、LinkCtlRuleDetailDto.java //controller接口输入输出类
- service:LinkCtlRuleServiceImpl.java、LinkCtlRuleService.java //服务接口和实现类
- dao:LinkRuleDao.java、LinkRuleDaoImpl.java //数据访问接口
- mapper:LinkctlRuleMapper.java、LinkctlRuleMapper.xml //数据接入层
- entity:LinkctlRule.java //数据表对应的实体类
- java/com.icbc.hz1.inforisk/Application.java //启动类
- resources //静态资源及相关配置
- config:ssic.pub
- static:F5Check.html //静态资源
- application.properties //工程配置
- /src/test/
- java/com.icbc.hz1.inforisk/rule //单元测试类,接口实现类
- controller:LinkCtlRuleControllerTest.java
- dao:LinkRuleDaoImplTest.java
- service:LinkCtlRuleServiceImplTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1、controller
@RestController
@ApiVersion(1)
@Api(value="xxx", produces="application/json")
@RequestMapping(value="/linkctl/rule")
@ApiOperation(value="xxx")
@PostMapping(value="/delete")@GetMapping(value="/getInfos")
@RequestBody、@RequestParam(required = false)
@Validated
# 2、dao
- @UsingDataSource(DataSources.GCMS_GMIS)
# 3、entity
- @Table(name="GMIS.AFW_MAG")
- @Id
- @Column(name="AREA_CODE")
- @PostConstruct
# 4、vo
- @ApiModel(value="xxx", description="xxx")
# 6、启动类
- @SpringBootApplication(scanBasePackages={"com.icbc.hz1.inforisk"})
- @EnableMultipleDataSource(dataSourceName={"DataSources.GCMS_GMAG"}, defaultName="xxx", databaseType="xxx")
- @MapperScan(basePackages={"xxxx"}, sqlSessionFactoryRef="xx",configs={})
# 7、测试类
- @RunWith(MockitoJUnitRunner.class)
- @InjectMocks
- @Mock
- @Test
- @Before
# 9、配置类
- @Configuration
- @AutoConfigureBefore({xxxxx.class})
- @Bean
- @ConditionalOnProperty
- @Value("# { @environment['shire.sso.maxSession'] ?: 1}")
# 3、常用注解
# 1、注解相关操作
- @Target:注解作用域,TYPE可用于类或接口上,METHOD表示修饰方法
- @Retention:注解生命周期
- @Documented:注解被javadoc工具记录
- @Import:通过导入方式实现把实例加入springIOC容器中
- @Interface:注解类定义,jdk1.5后引入
@Target({ElementType.TYPE}) //注解作用域:类或接口
@Retention(RetentionPolicy.RUNTIME) //保留在运行时
@Documented
@Import(RuleEngineConfiguration.class)
public @interface EnableRuleEngine {
}
1
2
3
4
5
6
2
3
4
5
6
# 2、配置类相关操作
- @Configuration:定义配置类,内部包含有被@Bean注解的方法,这些方法被ApplicationContext上下文类进行扫描,并构建对于的bean,加入spring容器中
- @Bean:方法级注解,产生一个Bean对象。initMethod属性和destoryMethod属性,指定Bean在构造之后和销毁之前需要执行的方法名。获取使用注解:
- @PostConstruct:构造函数执行完之后执行
- @PreDestroy:bean销毁前执行
- @scope:实例范围
- Singleton:单例
- Prototype:每次调用新建一个Bean的实例
- Request:Web项目中,给每一个http request新建一个Bean实例
- Session:web项目中,给每一个http session新建一个Bean实例
- @lazy:懒加载,默认在容器启动的时候创建对象,修改为第一个使用时创建对象并实例化
- @profile("development"):标记不同的配置环境,通常应用于不同环境启动
- @Conditional:满足条件给容器注册bean
# 3、依赖注入
# 1、注解声明
- @Component:组件,没有明确的角色
- @Service:业务逻辑层使用,生成bean时规则,第一个变小写,两个字母都大写则会都变为小写,使用@Service("xx")重定义类名字
- @Repository:在数据访问层DAO层使用
- @Controller:在展现层MVC使用
# 2、注入
- @Autowired:Spring提供的注解。类型、限定符、命名匹配,配合@Qualifier注解,指令beanName
- @Inject:JSR-330提供的注解。类型、限定符、命名匹配,配合@Named注解,指定beanName
- @Resource:JSR-250提供的注解。命名、类型、限定符匹配
解析:@Autowired、@Inject、@Resource可注解在set方法上或者属性上,从代码清晰度考虑,建议注解在属性
# 3、扩展
BeanPostProcessor定义了两个接口:
public interface BeanPostProcessor{
//前置处理:bean初始化方法调用前被调用
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//后置处理:bean初始化方法调用后被调用
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
1
2
3
4
5
6
2
3
4
5
6
# 4、内置注解
- @Override:重写方法
- @Deprecated:过时的,已经被新的形式取代
- @FuntionalInterface:用于接口,被注解的接口是一个函数式接口,仅包含一个抽象方法的接口,有lambda表达式使用,非函数式接口报错
- @SuppressWarning:抑制编译器可能的警告