一.Maven常见命令
- clean
- mvn clean:清理(删除)编译的文件
- 使用插件:
- maven-clean-plugin:2.5:clean
- compile
- mvn compile:编译主目录的文件
- 使用插件:
- maven-resources-plugin:2.6:resources
- maven-compiler-plugin:3.1:compile
- test
- mvn test: 编译并运行test目录的代码
- 使用插件:
- maven-resources-plugin:2.6:resources
- maven-compiler-plugin:3.1:compile
- maven-resources-plugin:2.6:testResources
- maven-compiler-plugin:3.1:testCompile
- maven-surefire-plugin:2.12.4:test
- package
- mvn package:打包项目,jar包或war包
- 使用插件:
- maven-resources-plugin:2.6:resources
- maven-compiler-plugin:3.1:compile
- maven-resources-plugin:2.6:testResources
- maven-compiler-plugin:3.1:testCompile
- maven-surefire-plugin:2.12.4:test
- maven-jar-plugin:2.4:jar
- install
- mvn install:安装到仓库
- 使用插件 :
- maven-resources-plugin:2.6:resources
- maven-compiler-plugin:3.1:compile
- maven-resources-plugin:2.6:testResources
- maven-compiler-plugin:3.1:testCompile
- maven-surefire-plugin:2.12.4:test
- maven-jar-plugin:2.4:jar
- maven-install-plugin:2.4:install
- 其他命令
- mvn deploy:部署,部署到私服
- mvn tomcat:run:运行
二.Maven依赖
- 依赖范围:
- A 依赖B,需要再A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
- compile:编译范围, 编译范围的依赖会在编译,测试,运行,打包(war)都会使用依赖jar包
- provided:提供依赖,provided依赖在编译,测试时需要,运行,打包都不会包含。
- runtime:运行依赖,runtime依赖在运行、测试、打包的需要,但在编译的时候不需要,比如:jdbc的驱动包
- test:测试依赖,在编译和运行时不需要,他们只有在测试编译和测试运行时使用, 比如junit,也不会被打包
- system:系统依赖,system依赖与provided类似,但是你必须显示的提供一个对于本地系统中jar文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
- A 依赖B,需要再A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
- 注意:
- 打包jar包时,不会包含任何依赖包的。
- 默认依赖范围:compile
- 依赖范围由强到弱的顺序是:compile-->provided-->runtime-->test
三.创建Maven的web项目
1.ideal创建web项目
-
先创建java项目->在pom.xml文件中添加打包格式的代码(war格式)
war src.main包下创建webapp包->在webapp下创建WEB-INF包->在WEB-INF下创建web.xml的配置文件(可直接在其他web项目下复制一份)->在webapp包下创建一个主页面index.html
- 在pom.xml中添加maven和Tomcat插件
org.apache.maven.plugins
maven-compiler-plugin
3.6.1
1.8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
/
8080
- 双击tomcat7:run运行
- 会出现index.html页面中的内容
2.eclipse创建web项目
- 创建maven项目,打包格式选择war
- 在src.main.webapp下创建WEB-INF包->在WEB-INF下创建web.xml配置文件(可在其他项目下直接复制)
- 在webapp包下创建index.html的主页面
- 在pom.xml中添加maven和Tomcat插件
org.apache.maven.plugins
maven-compiler-plugin
3.6.1
1.8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
/
8080
- 更新maven项目(alt+F5)
- 运行
- Run as ->Maven build->tomcat7:run
四.Spring-IoC
1.Spring的好处
方便解耦,简化开发:Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring 管理
AOP(Aspect Oriented Programming:即面向切面编程) 编程的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序
方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持
降低 JavaEE API 的使用难度:Spring对 JavaEE
-
Ioc : 控制反转
- IOC是 Inverse of Control 的简写,意思是控制反转。是降低对象之间的耦合关系的设计思想。
- 通过IOC,开发人员不需要关心对象的创建过程,交给Spring容器完成。具体的过程是,程序读取Spring 配置文件,获取需要创建的 bean 对象,通过反射机制创建对象的实例。
- 缺点:
- 对象是通过反射机制实例化出来的,因此对系统的性能有一定的影响。
-
DI-依赖注入
- Dependency Injection,说的是创建对象实例时,同时为这个对象注入它所依赖的属性。相当于把每个bean与bean之间的关系交给容器管理。而这个容器就是spring。
- 例如我们通常在 Service 层注入它所依赖的 Dao 层的实例;在 Controller层注入 Service层的实例。
依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦.
2.scope的属性
singleton (默认属性)
Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引用返回给调用者,spring IOC继续对这些Bean进行后续的生命管理。BeanFactory只管理一个共享的实例。所有对这个特定bean的实例请求,都导致返回这个唯一bean实例的引用。即每次拿到的对象都是引用的同一个地址的对象。当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
-
2.prototype (多例的)
- Spring将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不再管理这些Bean的生命周期。
每次对这个bean的实例请求都会导致一个新的实例的创建。当用户需要不受其他用户对象影响的对象或有类似的需求时,用这个比较好。 - 即每次拿到的对象都是引用的不同地址的对象。相当于一个new的操作。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责
- Spring将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不再管理这些Bean的生命周期。
-
request
- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
-
session
- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
3.小结
- < property>标签赋值的时候,一定要有无参构造器(此时定义了有参构造的话,默认的无参构造就没了,也要加上)
- spring默认生成的对象时单例模式
- scope在web项目下默认有四个属性值
- request , session , singleton(单例) , prototype(多例)
- scope在java项目下只有两个属性值
- singleton(单例) , prototype(多例)
- 如果使用有参构造赋值的话就把< property>标签改为< constructor-arg>标签
- < property>标签和< constructor-arg>标签也可以混合使用(就是在运行时时候,先调用< constructor-arg>的有参构造,再调用< property>中的属性内容)
- 有参构造赋值的方式一共有四种
- name + value
- index + value
- 根据索引赋值,从0开始
- type + value
- 使用type的时候,相同数据类型也是需要确定顺序位置的,不然传的值位置不正确
- value
- 要确定构造参数的顺序,不然传的值位置不正确
- 把一个对象赋值进去的话,需要向创建出来这个对象,得到一个id属性值,然后通过ref="id属性值",赋值进去
五.Spring-IoC的简单例题
创建⼀个学⽣类,⾥⾯有如下属性:
1. ⽣⽇BirthDays类⾥⾯的属性有year int, month int, day int
2. Student 类:sid int, name String, sex boolean, score double, tel String,BirthDay birth
3. 使⽤⽆参构造器和property给对象赋值
4. 使⽤带参构造器给对象赋值(四种⽅式都均使⽤)
5. 使⽤namespace命名空间p给对象学⽣赋值
- 创建Student 类
public class Student {
private int sid;
private String name;
private boolean sex;
private double score;
private String tel;
private BirthDays birth;
public Student() {
}
public Student(int sid, String name, boolean sex, double score, String tel, BirthDays birth) {
this.sid = sid;
this.name = name;
this.sex = sex;
this.score = score;
this.tel = tel;
this.birth = birth;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public BirthDays getBirth() {
return birth;
}
public void setBirth(BirthDays birth) {
this.birth = birth;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Student{");
sb.append("sid=").append(sid);
sb.append(", name='").append(name).append('\'');
sb.append(", sex=").append(sex ? "男":"女");
sb.append(", score=").append(score);
sb.append(", tel='").append(tel).append('\'');
sb.append(", birth=").append(birth);
sb.append('}');
return sb.toString();
}
}
- 创建BirthDays类
public class BirthDays {
private int year;
private int month;
private int day;
public BirthDays() {
}
public BirthDays(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("BirthDays{");
sb.append("year=").append(year);
sb.append(", month=").append(month);
sb.append(", day=").append(day);
sb.append('}');
return sb.toString();
}
}
- 在resources下创建Spring config文件
- Student.xml : 验证有无参构造方法的
- student1.xml : 使⽤namespace命名空间p给对象学⽣赋值
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- 在test.java.com.mvn下新建测试类
- StudentTest.java : 测试验证有无参数构造赋值
- Student1.java : 测试使⽤namespace命名空间p给对象学⽣赋值
public class Student1 {
@Test
public void student1(){
ApplicationContext ac=new ClassPathXmlApplicationContext("student1.xml");
System.out.println(ac.getBean("birth"));
System.out.println(ac.getBean("stu"));
}
}
public class StudentTest {
@Test
public void studentTest(){
ApplicationContext ac=new ClassPathXmlApplicationContext("student.xml");
//无参构造器
System.out.println(ac.getBean("birth1"));
System.out.println(ac.getBean("stu1"));
//有参构造器name+value
System.out.println(ac.getBean("birth2"));
System.out.println(ac.getBean("stu2"));
//有参构造器index+value
System.out.println(ac.getBean("birth3"));
System.out.println(ac.getBean("stu3"));
//有参构造器type+value
System.out.println(ac.getBean("birth4"));
System.out.println(ac.getBean("stu4"));
//有参构造器type+value
System.out.println(ac.getBean("birth5"));
System.out.println(ac.getBean("stu5"));
}
}