注解以及相关内容 JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 创建组件之间协作的行为通常称为 Wiring,装配bean的方式有很多 采用XML文件的装配方式 采用基于注解的装配方式 @Service @Controller @Repository @Component 基于Java的装配方式 通过 @Configuration 和 @Bean实现
1.注解
01.创建注解
元注解: @Target @Retention @Document @Inherit
@Retention
RetentionPolicy
.SOURCE
.CLASS
.RUNTIME
@Target
ElementType
.TYPE .FIELD .PARAMETER .CONSTRUCTOR
.METHOD .LOCAL_VARTABLE MODULE
@interface
String[] value() ;
如果注解只有一个成员,则成员名必须取名为value(),使用时可以忽略成员名和赋值号
示例
JDK内置的注解
--没有成员的注解称为 标识注解
import java.lang.annotation.*
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}
第三方框架的注解
Spring
@Service
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
String value() default "";
}
Junit
@Test
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
Class<? extends Throwable> expected() default Test.None.class;
long timeout() default 0L;
public static class None extends Throwable {
private static final long serialVersionUID = 1L;
private None() {
}
}
}
02.注解的使用
@
作用二:
自动处理源代码以产生更多的源代码-配置文件-脚本或者其他我们想要的东西
例如-使用注解,根据模板来生成不同源码
03.注解的应用
RUNNING 中的情况
DI容器
DI的容器类-创建需要的对象并配置依赖关系
使用代码
SimpleContainer.getInstance(ServiceA.class).callB();
底层代码:注解工具内部处理机制
注解如何被处理的,在运行时的处理过程
2.Hibernate 注解
Hibernate实现JPA注解
pom.xml组件 hibernate-core、hibernate-entitymanager、hibernate-validator、
hibernate-jpa-2.0-api
配置文件 hibernate.cfg.xml
数据库相关配置
开发常用的参数
会话相关配置
配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式
Hibernate三种类型
类级别的注解: @Entity @Table @Embeddable
属性级别注解: @Id、@GeneratedValue、@Column、@Embedded、@EmbeddedId和@Transient
映射关系注解: 一对一,一对多,多对多 @OneToOne、 @OneToMany(mappedBy="room") 、@ManyToOne
单向、双向
外键连接 @JoinColumn
@GeneratedValue提供了主键的生成策略,两个属性,分别是strategy和generator
@GeneratedValue(strategy=GenerationType.IDENTITY)
四种主键生成策略
包括GenerationType.TABLE,
GenerationType.SEQUENCE,
GenerationType.IDENTITY和
GenerationType.AUTO
主键生成策略交给持久化引擎(persistence engine),持久化引擎会根据数据库
在以上三种主键生成策略中选择其中一种
可以直接@GeneratedValue
和JAP<Java Persistence API>之间的关系
import javax.persistence.EntityManager;
import javax.persistence.FlushModeType;
import javax.persistence.LockModeType;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.metamodel.EntityType;
3. Spring中的注解
工程结构
底层数据库(具体数据的存储)
——>dao(实现从表中读数据)
——>domain(表与实体进行关联,进行实体的定义,set,get方法的定义)
——>service(逻辑的实现,进行数据关联,方便底层取数据)
——>controller(方便为前段提供数据)
主容器中 applicationContext.xml
定时器
applicationContext-quartz
org.springframework.scheduling.quartz
定义quartz的配置文件applicationContext-quartz.xml
Spring MVC 中的常用注解
import javax.annotation.Resource;
import javax.annotation.Resources;
import javax.annotation.Generated;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Component;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ComponentScan
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;
1.说明
01:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件
@Component是用来标记任何被Spring管理的组件。泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Controller用来标记presentation层(比如web controller)。
@Repository用来标记persistence层(比如DAO)即标注数据访问组件
@Service用来标记service层。标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
03.
@RequestMapping 是一个用来处理请求地址映射的注解
接受客户端传递过来的参数包括
路径变量(url),内容变量(http body),头变量(header),COOKIE变量等几类。
@PathVariable 注解,其用来获取请求路径(url )中的动态参数
Spring 装载bean
通过( Applicatioon Context)应用上下文 进行组装
Spring MVC
特点
01.DI实现软件组件的松耦合
02.AOP 将功能分离出来形成可以重用的组件
03.Spring不会强迫应用继承它们的类或者实现它们的接口,从而导致应用和框架绑死,即非侵入式
04.Spring通过模板封装来消除样板式代码
Spring 容器
第一类:bean 工厂是最简单的容器,提供基本的 DI 支持;
第二类:应用上下文基于 BeanFactory 构建,并提供应用框架级别的服务
创建-组装-配置-管理
装配
1.自动装配
1.组件扫描
01.显示启用组件扫描
通过注解的方式: @ComponentScan
通过XML配置的方式:spring-context空间中 context:component-scan base-package="al"
2.自动装配
自动装配
@Autowired
2.显示装配
Java装配
01.创建配置类 @Configuration 表明这是一个配置类
02.声明简单的bean @Bean
03.借助javaConfig实现注入 必要的java功能产生实例
XML装配
01.创建XML文件
以<beans>元素作为根
声明一个bean <bean>
注入初始化Bean <constructor-arg>
设置属性<property>
3.混合装配
在典型的Spring应用中,我们可能会同时使用自动化和显式配置
Spring Boot
1.起步依赖- 依赖管理 --
2.自动配置
@SpringBootApplication: 开启组件扫描和自动配置功能
将 @Configuration 、 @ComponentScan @EnableAutoConfiguration
分别是标明该类是基于Java的配置,启动组件扫描、开启自动配置
3.在Spring Boot基础上调整
01.起步依赖: 前置依赖
示例:覆盖起步依赖引入的传递依赖 是在Maven中pom.xml调整 <exclusions>
02.自动配置的调整
基于条件化配置的特性。使用Spring Boot 提供的条件化注解
使用显式配置进行覆盖
使用属性进行精细化配置
4.Actuator 提供运行时检视应用程序内部情况的能力
5.常规的-内嵌的方式部署
01.把项目启动这个任务直接委托给SpringApplication.run方法
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6.Tomcat部署-编码方式
一个spring-boot项目想以外部的 tomcat部署 而不是内嵌的方式
01.这个时候需要让spring-boot 入口类继承至 SpringBootServletInitializer 并重载configure方法,
02. 并给项目的打包方式改为war,pom.xml 中设置 <packaging>war</packaging>
packaging给出了项目的打包类型,即作为项目的发布形式,其可能的类型
03.同时添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
04.代码
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BillingApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}