首先导入 spring maven的包 Spring Web MVC(spring有很多包,导入Spring Web MVC包,它会自动引入其他包),随后会用到spring-jdbc依赖,Spring就是一个大杂烩
一、
SSH(过时) Struct2 + Spring + Hibernate
SSM SpringMVC +Spring +Mybatis
优点1、 Spring是一个开源的免费容器 2、一个轻量级的非入侵式的框架 3、控制反转IOC,面向切面编程AOP 4、支持事务处理
二、Spring
Spring的七大模块AOP , ORM,DAO,WEB,Context,Web MVC ,Spring Core
Spring Boot 快速开发脚手架,约定大于配置
Spring Cloud 基于SpringBoot实现
唯一的弊端:发展太久,违背了原来理念,配置十分繁琐!!!
三、IOC的原型: 之前service层调用dao层的 接口(将dao层的接口实现类对象new的方式注入),现在service层增加的set方法,this.name=name,以形参传入dao层接口,dao层实现类注入对象随形参改变。1、set注入,2、构造器注入,3、其他方式注入
public interface UserService { public void setUserDao(UserDao userDao); public void getUser(); }
package com.rzgsl.service; import com.rzgsl.pojo.UserDao; public class UserServiceImpl implements UserService { private UserDao userDao ; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }
public class MyTest { public static void main(String[] args) { UserService userService = new UserServiceImpl(); userService.setUserDao(new PersonDaoImpl()); userService.getUser();
注意:在MyTest中,如果在UserService接口中没有setUserDao方法,那么这里得用 UserServiceImpl userService = new UserServiceImpl();
反转实现目的:原来在对象在程序员手上,现在反转给用户,耦合性降低
四、Bean创建对象
package com.rzgsl.pojo; public class Hello { private String str; private String getStr(){ return str; } public void setStr(String str){ this.str=str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }
依赖注入:就是调用类的set方法注入
xml创建对象,和java创建对象相同点。bean的id相当于对象名;class是全路径 ;property是设置属性
public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); // Student student = (Student) context.getBean("student"); // student.getAge(); Teacher teacher = (Teacher) context.getBean("teacher"); teacher.toString();
注意:java调用无参构造时就创建了对象,如果要增加有参构造,那么在java类中也应该留有参构造方法,构造方法要写上this.name = name。
起一个applicationContext.xml的文件,这是正规的叫法,import标签导入进来其他的resource,每一个标签都是一个bean.xml文件,这样不同程序员编写的bean能集合到一个xml中,使用的时候只使用总的就可以了
五、C\P命名空间要先在xml中引入约束
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
P命名空间property 的缩写(简单的属性赋值可以使用):
C命名空间construct的缩写(有参、无参构造器赋值)
使用的时候再次强调,在类中要有对应的方法
六、作用域
singleton默认是单例,一共只创建一个对象,单线程使用。
prototype原型模式,每次创建一个新对象,一般多线程使用。
request、session、application都是在web项目中才能使用,
七、Bean自动装配
1、在xml中显式装配(上面所列的xml配置bean就属于这种)
2、在java中显示装配
3、隐私的装配,在bean中ref引用,隐式的可以byType或byName,byType如果有两个类型一样id不同的bean,那么就会报错
注意:类的shot方法,public void shot()和void shot()不同,后者不能被其他类调用。作用域的问题!!!
4、大部分情况下会使用注解开发,而不是使用xml
Autowired(spring注解)默认是根据byType自动装配,所以有多个类型的xml或者注解某个类的时候,会报错,这时候可以再添加@Qualifier注解,指定名称.这个是spring自带的,换框架的时候,要spring。用在类上,或用在类的方法上,不用写set方法也能用。常用
补充:xmlns:XML Namespace xmlns表示默认的Namespace。
xsi:schemaLocation属性其实是Namespace为http://www.w3.org/2001/XMLSchema-instance里的schemaLocation属性,正是因为我们一开始声明了
1、先再xml中添加约束,再开启
2、通过byName实现,如果一个类有多个不同名字的bean,那么可以@Autowired再加一个@Qualifiler
3、与Resource(java注解)相比,Resource默认是根据byName自动装配,这个是java自带的,换框架的时候,不需要spring,不成功,再通过byType。不常用
public class Person { @Autowired private Dog dog; @Autowired private Cat cat; private String name; public Dog getDog() { return dog; } public Cat getCat() { return cat; } public String getName() { return name; } @Override public String toString() { return "Person{" + "dog=" + dog + ", cat=" + cat + ", name='" + name + '\'' + '}'; } }
七、@Componet组件
1、bean.xml中开启 2、在类上面添加@Component注解
作用:用注解生成对象。不用在bean.xml中配置bean,生成对象了
@value 赋值……