Java Spring 系列入门

Spring Framework

  • IoC(Inversion of Control):程序中不主动 new 对象,而是由外部(Spring 的容器)提供对象,实现充分解耦;这一创建权的转移称为控制反转,这些被管理的对象称为 Bean;
  • DI(Dependency Injection):在容器中建立各个 Bean 之间的依赖关系的过程,称为依赖注入;
  • Maven Dependency 中导入 spring-context 坐标后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 在 resources/ 中创建 applicationContext.xml:
// 可添加 autowire 自动注入依赖
<bean id=”bookService” class=”com.example.service.impl.BookServiceImpl”>
<property name="bookDao" ref="bookDao" /> /* Setter 注入 */
// name 为构造函数形参名,可改为使用 type,或使用 index="0"
<constructor-arg name="bookDao" ref="bookDao" /> /* 构造器注入 */
<property name="databaseName" value="mysql" />
</bean>
// name 起别名,scope 设置不为单例(默认为 singleton)
<bean id="bookDao" name="dao dao1" class="com.example.dao.impl.BookDaoImpl"
scope="prototype" init-method="init" destroy-method="destroy" />

// 给 BookDao 定义 Setter 方法或构造方法,然后添加
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = (BookService)ctx.getBean("bookService");
ctx.close(); 或 ctx.registerShutdownHook();
  • Bean 的生命周期:创建对象(内存分配)→ 构造 → 属性注入(Setter)→ 初始化(继承自 InitializingBean 的 afterPropertiesSet())→ 使用 → 销毁(继承自 DisposableBean 的 destroy());
  • Bean Factory ⇒ ApplicationContext ⇒ ClassPathXmlApplicationContext;

Spring Boot

  • Spring Boot Web 内置 Tomcat,兼容 Servlet 与 JSP 规范;三层架构:Controller(控制层)、Service(业务逻辑层)、DAO(数据访问层 / 持久层);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 注解配置 Bean
<context:component-scan base-package="com.example" />
// 纯注解 SpringConfig.java
@Configuration
@ComponentScan("com.example")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class")
public class SpringConfig {
// 用于第三方 Bean
@Bean
public DataSource dataSource(BookService bookService) {
DataSource ds = new DataSource();
ds.setUsername("root");
return ds;
}
// 代码里改为
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  • 通过注解开发支持无 XML 配置;纯注解开发: @Component("bookDao") ,三个与之完全等同的注解: @Service@Repository@Controller
  • @Scope("prototype")@PostConstruct@PreDestroy@Autowired (默认按类型注入);
  • @Primary (指定优先此类对象)、@Qualifier("")+@AutoWired (类型耦合)、 @Resource(name="")(名字耦合,不推荐)、 @Value("")

SpringMVC

  • 使用 @RestController 声明 Controller 负责 Tomcat 路由和返回;原始方法为在 @RequestMapping("/")方法中声明 HttpServletRequest 对象参数,再通过 getParameter(name) 获得对应参数字符串;现在处理函数只需定义好参数即可获取 GET 与 POST 方法后接的各项参数; @RequestParam(name="username", require=false) 设置不必须的后接参数;
  • 一个 @RestController 类的方法的返回值即为 @ResponseBody ,若为复杂类型,会转换成 JSON 返回给客户端;
  • 前端工程化框架打包的结果存放在 /Resources 中;
  • 启动类声明注解 @SpringBootApplication 中包含了 @ComponentScan
  • 过滤器、Cookie、Session 等内容属于 JavaWeb;JWT、OSS 等技术属于解决方案;接受请求、相应数据、拦截器、全局异常处理等 Spring 内 Web 功能属于 SpringMVC;IoC、DI、AOP、事务管理等架构理念支持属于 Spring Framework,JDBC 等数据库操作被封装在 MyBatis;后三者统称为 SSM;SpringBoot 用于快捷启动整个项目的开发;

Mybatis

  • 在 application.properties 中配置连接四要素:Driver、URL、Username、Password;
  • 接口类使用 @Mapper 注解,返回值变量定义前加 @Select("command") 注解,会自动将查询答案返回到此变量中,也可以定义方法;增删改的操作类似;使用 @Options 返回插入后条目的主键值;可以用 @Results@Result 字段注解手动映射返回值封装;
  • 使用 getConnection() 获取数据库连接池的连接;可使用 lombok 工具包根据特定注解自动生成各类方法(getter()、toString() 等);