基础

1. IDEA 中 project 和 module 的区别

在 IDEA 中 project 是最顶级的结构单元,然后就是 module,一个 project 可以有多个 module。也就是说,一个 project 是由一个或多个 module 组成。

此外, IntelliJ IDEA 的Project是一个不具备任何编码设置、构建等开发功能的概念,其主要作用就是起到一个项目定义、范围约束、规范类型的效果,或许,我们也可以简单地理解Project就是一个单纯的目录,只是这个目录在命名上必须有其代表性的意义。在缺省情况下,IntelliJ IDEA 是默认单Project单Module的,这时Project和Module合二为一,在没有修改存储路径的时候,显然Project对Module具有强约束作用!不过说实话,这里就是将Module的内容放在了Project的目录下,实际上还是Module自己约束自己。

2. 项目结构

project 项目:一个完整的项目中包含了一个或多个模块。其实就是文件夹

module 模块:

package 包:

class 类:

3. Webapp 项目

Plugin 插件在 <build> => <plugins> => <plugin>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- jetty -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<!-- 热部署,每10秒扫描一次 -->
<scanIntervalSeconds>10</scanIntervalSeconds>
<!-- 可指定当前项目的站点名 -->
<contextPath>/jetty01</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<!-- 设置启动的端口号 -->
<port>9090</port>
</connector>
</connectors>
</configuration>
</plugin>

<!-- tomcat -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 启动端口 -->
<port>8081</port>
<!-- 项目的站点名 -->
<path>/tomcat01</path>
<!-- 字符集编码 -->
<uriEncoding>UTF-8</uriEncoding>
<!-- 服务器名称 -->
<server>tomcat7</server>
</configuration>
</plugin>

4. 本地仓库的包 maven 不识别

在进行 mvn install 的时候加上 -e 和 -X ,显示详细的日志信息。一定要详细的看日志,不要放过每一行。

遇到的问题解决方法是:要先安装项目,即对 maven-project 执行:mvn install。然后在对项目中的子模块进行 install。

5. 选择相同的版本

  • 选中项目文件夹,鼠标右键选择open module Settings,选择合适的 jdk 版本
  • File(文件) -> Project Structure(项目结构) ->修改jdk版本 (project 和 module 都要修改)
  • Setting -> Build -> Compiler -> Java Compiler 修改 jdk 版本
  • 关注项目或者模块中 pom.xml 文件中 java 的版本

注意在使用 spring boot 的时候,spring boot 本身的版本和 jdk 的版本也要对应。

6. 反射和注解

1
2
3
4
5
6
7
8
9
10
11
反射
Class c1 = Student.class;
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());

Class c2 = Class.forName("com.xxx.test.Student");
System.out.println(c1 == c2);

Student s = new Student();
Class c3 = s.getClass();
System.out.println(c3 == c2);

注解:就是 java 代码里的特殊标记,比如:@Override@Test 等,作用是:让其他程序根据注解信息来决定怎么执行该程序

需要注意的是注解可以用在类上、构造器上、方法上、成员变量上、参数上等位置

自定义注解

1
2
3
public @interface 注解名称 {
public 属性类型 属性名() default 默认值 ;
}

Spring

spring 框架是一个开源的 JavaEE 的应用程序。主要核心是 IoC(控制反转/依赖注入)和 AOP(面向切面编程)两大技术 和 “Spring JDBC + 事务”。

spring 基于分布式的应用程序,基于轻量级的框架。

spring 模块划分:

  • Spring IOC 模块:Bean 对象的实例化
  • Spring AOP 模块:动态代理,面向切面编程
  • Spring JDBC+事务
  • Spring Web 模块

IOC – 容器、bean、依赖注入

业务层实现中,创建了数据层的对象。如果我们想换一个数据层的实现。就需要重新更改业务层的代码逻辑,并且重新编译代码,测试,发布等一系列流程。于是,我们希望有一个方法。在使用对象时,在程序中不要主动使用 new 产生对象,转换为由外部提供对象。那么 IOC 就提供了这样的方法,称为控制反转,将对象的创建控制权由程序转移到外部。这种思想称为控制反转。

spring 提供了一个容器,称为 IoC 容器。那么我们使用对象时,由主动 new 产生对象转换为由 IoC 容器提供对象。IoC 容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在 IoC 容器中统称为 Bean。

在容器中建立 bean 和 bean 之间的依赖关系的整个过程,称为依赖注入。

于是我们使用 IoC 容器管理 bean,在 IoC 容器内将有依赖关系的 bean 进行关系绑定。可以做到充分解耦。最终,使用对象时不仅可以直接从 IoC 容器中获取,并且获取到的 bean 已经绑定了所有的依赖关系。

Bean 默认为单例,其中 scope 控制是否为单例,“prototype” 表示不为单例。

1
<bean id="bookDao" class="com.xxx.dao.impl.BookDaoImpl" scope="prototype" />

bean 中的对象是通过无参的构造方法来创建对象的。也可以通过静态工厂实例化 bean,或者使用实例工厂实例化 bean。

关于 bean 的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
<bean
id="bookDao" // bean 的 ID
name="dao bookDaoImpl" // bean 的别名
class="com.xxx.dao.impl.BookDaoImpl" // bean 类型,静态工厂类,FactoryBean 类
scope="singleton" // 控制 bean 的实例数量
init-method="init" // 生命周期初始化方法
destroy-method="destory" // 生命周期销毁方法
autowire="byType" // 自动装配类型
factory-method="getInstance" // bean 工厂方法,应用于静态工厂和实例工厂
factory-bean="com.xxx.factory.BookDaoFactory" // 实例工厂 bean
lazy-init="true" // 控制 bean 延迟加载
/>

关于依赖注入相关:

1
2
3
4
5
6
7
8
9
10
11
12
<bean id="bookService" class="com.xxx.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/> // 构造器注入引用类型
<constructor-arg name="msg" value="WARN"/> // 构造器注入简单类型
<property name="bookDao" ref="bookDao"/> // setter 注入引用类型
<property name="msg" value="WARN"/> // setter 注入简单类型
<property name="names"> // setter 注入集合类型
<list> // list 集合
<value>itcast</value> // 集合注入简单类型
<ref bean="dataSource"/> // 集合注入引用类型
</list>
</property>
</bean>

注解

AOP

面向切面编程,在不惊动原始设计的基础上为其进行功能增强。Spring 理念:无侵入式编程。

Spring MVC

属于 Web 层开发技术。是一种基于 Java 实现 MVC 模型的轻量级 Web 框架。

Spring Boot

帮我们管理各种包的版本,也就是坐标。于是乎,我门引入包的时候,就不需要写包(依赖)的版本了。