前端框架:Bootstrap,NodeJS,Vue/React/Angular
CGI
——每次请求产生一个进程,重量级。Servlet
——每次请求产生一个线程,轻量级。控制逻辑、页面表现、业务逻辑全部混在一起,前端设计无法介入
JSP
——编译成Servlet,在HTML中嵌入java代码。前端开发人员可以进行较独立的设计和修改JSP+Bean
Web MVC
JavaEE是一套使用Java进行企业级Web应用开发的大家一致遵循的工业标准。
<localRepository>D:\software\maven\repo</localRepository>
<mirror>
<id>ali</id>
<mirrorOf>*</mirrorOf>
<name>ali maven repo</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
以上是windows,若为mac:
<localRepository>/usr/local/repo</localRepository>
<mirror>
<id>ali</id>
<mirrorOf>*</mirrorOf>
<name>ali maven repo</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
artifactId
自动联想完成添加Spring是什么:
Spring优点:
由容器来管理对象之间的依赖关系(而不是对象本身来管理),就叫“控制反转”或“依赖注入”
Bean容器
框架的基本思想就是IOC/DI
IOC(Inversion of Control)
:由容器来负责控制对象的生命周期和对象间的关系(一种减少类与类之间依赖的设计原则)
DI(Dependency Injection)
:在系统运行中,由容器动态的向某个对象提供它所需要的其他对象
Spring
就是一个IOC容器
IOC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想
(1)设值注入
IOC容器使用属性的setter方法
来注入被依赖的实例
(2)构造注入
IOC容器使用构造器
来注入被依赖的实例
用index属性指定顺序,从0开始
(1)设值注入的优点:
(2)构造注入的优点
设值注入为主,构造注入为辅
标记语言:
(1)Html(非严格,容错)
(2)Xml(可扩展标记语言,严格定义,格式良好的)
org.springframework.beans.factory.BeanFactory
是Spring IoC容器的实际代表者,IoC容器负责容纳bean,并对bean进行管理。
使用XML
作为配置元数据的描述格式,对那些我们希望通过Spring IoC容器管理的bean进行定义。
ApplicationContext
是BeanFactory
的扩展,功能得到了进一步增强,比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext
)。
ApplicationContext可利用 ContextLoader
在 Web应用启动的时候 自动创建 (SSH整合的时候 就是采用这种方式 )
创建 ApplicationContext容器时 ,所有 singleton bean
将会被 预初始化 。
(1)在beans下添加子元素bean
(2)设置id属性:bean对象在容器中的唯一标识,通过这个id的值可以获取到容器中对应的bean对象
(3)设置class属性:创建bean对象的类
各组件的相互引用实质上就是依赖关系,可以通过Spring的IOC容器完成依赖注入。
(1)设值注入
在需要配置依赖的组件对应的
元素中配置
子元素,指定要注入的属性的名字和值
(2)构造注入
在需要配置依赖的组件对应的
元素中配置
子元素,按构造函数参数顺序指定对应要注入值
依赖关系的值可以是一个确定的常量,也可以是容器中其他bean的引用
通常对于普通属性的值不纳入配置管理,主要是配置bean实例之间的依赖关系
一般依赖配置分四种情况
(1)注入普通属性
(2)注入bean引用
(3)注入嵌套bean
(4)注入集合类型值
(3)使用自动装配注入bean引用
设定bean元素的autowire
属性
byName
:根据名字自动装配,在容器中找到id
属性与需要注入的属性(setter
方法的名字)同名的bean完成注入byType
:根据类型匹配自动装配
(4)注入嵌套bean
在bean的property子元素中嵌套一个无id的bean元素
嵌套的bean将不被spring访问。
<bean id="chinese" class="app.service.impl.Chinese">
<!-- 将stoneAxe注入给axe属性 -->
<property name="axe">
<bean class="app.service.impl.StoneAxe"/>
</property>
</bean>
(5)注入集合值
在property元素中使用
子元素分别这是List、Set、Map、Properties集合属性值
<bean id="chinese" class="app.service.impl.Chinese">
<property name="axe" ref="steelAxe"/>
</bean>
<bean id="steelAxe“ class="app.service.impl.SteelAxe"/>
ApplicationContext ctx = new
ClassPathXmlApplicationContext("bean.xml");
Person p = (Person)ctx.getBean("chinese");
//Person p = ctx.getBean("chinese" , Person.class);
p.useAxe();
getBean
获取时产生一个新的实例。singleton
生命周期:1.创建;2.使用;3.销毁
prototype bean:每次请求产生一个新的实例,spring无法跟踪其生命周期
singleton bean:单例对象,每次客户请求都返回同一个共享实例,spring可以跟踪其创建和销毁,实现对其生命周期的管理
生命周期的管理时机:1.注入之后——init-method;2.销毁之前——destroy-method
(1)依赖注入之后
必要资源的申请
在< bean>的配置中加入init-method
属性指定bean的全部属性注入/设值成功后要执行的方法
<bean id="chinese" class="app.service.impl.Chinese" init-method="init">
<property name="axe" ref="steelAxe"/>
</bean>
(2)Bean销毁之前
占用资源的回收
在< bean>的配置中加入destroy-method
属性指定bean在销毁之前要执行的方法
<bean id="chinese" class="app.service.impl.Chinese" destroy-method=“destroy">
<property name="axe" ref="steelAxe"/>
</bean>
(3)协调作用域不同步的bean
√ Singleton bean依赖Singleton bean
√ Prototype bean依赖Prototype bean
√ Prototype bean依赖Singleton bean
X Singleton bean依赖Prototype bean
不同步的根源: Singleton bean只被初始化一次,多次请求获取同一个共享对象; Prototype bean每次请求都应重新创建。
解决方案
放弃容器注入,singleton bean每次使用prototype bean时主动从服务器请求新的prototype bean。耦合了SpringAPI
利用方法注入:使用lookup方法注入
public abstract Axe getAxe();
public void useAxe() {
System.out.println("正在使用 " + getAxe()+ "砍柴!");
System.out.println(getAxe().chop());
}
<bean id="steelAxe" class="app.service.impl.SteelAxe" scope="prototype"/>
<bean id="chinese" class="app.service.impl.Chinese">
<!-- 指定getAxe方法返回steelAxe-->
<lookup-method name="getAxe" bean="steelAxe"/>
</bean>
目的:消灭Bean的xml配置(大幅减少)
做法:代码标记,自动扫描
(1)context:component-scan
beans中引入context命名空间/XSD
配置< context:component-scan base-package=“….”/>
(2)Bean的配置:在类定义语句前注解
@Component (“beanName”):将注解类的对象加入容器,id为beanName。beanName缺省时为类名(首字母小写)
@Scope(“scope”):指定对象在容器中的作用域,无该注解时默认为singleton
(3)依赖的配置
@Autowired
:Spring的注解,在属性定于语句或setter方法前注解,将容器中匹配的对象自动注入,默认是byType
方式。如果需要采用byName
方式,可以通过添加@Qulifier(“name”)
的方式指定@Resource
:JSR-250标准注解,与@Autowried类似,默认是byName
方式。如果要采用byType
方式可以添加type参数,如@Resource(type=com.test.ExampleBean)
(4)值的注入(结合properties文件配置):
resource
目录下创建values.properties文件,填写key-value
在spring配置文件中:
@Value(“value”)
:在属性定义语句前注解,给对应属性注入常量值
@Value(“${propKey:defaultValue}”)
:给属性注入属性文件文件中propKey对应的值,如果propKey不存在,就注入defaultValue
(5)生命周期
@PostConstruct
:在类的成员方法定义语句前注解,注解的方法将会在对象完成构造且依赖注入完成后被自动调用对象初始化的钩子函数
@PreDestroy
:在类的成员定于语句前注解,注解的方法将在bean对象销毁之前被自动调用对象销毁的钩子函数
拥抱log4j,抛弃System.out.println
(1)在resources
目录下新建log4j.properties
(2)在pom.xml中添加依赖包
(3)为类添加logger静态属性
(4)在方法中用logger
输出日志
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.25version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.25version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
JUnit
:Java语言的单元测试框架
默认添加到生成的模板项目中:版本改到4.12
以上
在任意方法前加@Test注解都可测试。实际应用中测试用例与项目代码完全分离,一般scope限定为test
在test/java下的包中添加测试类,在测试方法前添加@Test
注解
在pom中添加sprint-test
依赖
测试类前添加注解@RunWith
和@ContextConfiguration
可以通过@Resource
给测试类注入容器中的bean
如果采用注解开发的方式: