BeanFactory和 ApplicationContext 的区别
(1)BeanFactory 是 Spring 容器中的顶层接口。
(2)ApplicationContext 是它的子接口。
(3)创建对象的时间点不一样。
ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:使用的时候创建对象。
Spring框架配置:
(1)导入spring框架jar包
(2)通过ApplicationContext 接口创建spring IOC容器:
ClassPathXmlApplicationContext: 从类的根路径下加载配置文件【常用】
FileSystemXmlApplicationContext: 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
AnnotationConfigApplicationContext: 当使用注解配置容器对象时, 用来读取注解,使用AnnotationConfigApplicationContext配置。
bean标签的作用:用于让spring配置创建对象,默认情况下调用的类中的无参构造函数。(如果没有无参构造函数不能构造成功)
bean标签的属性:
property[性质]
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。
singleton :默认值,单例的
prototype :多例的.
request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么 globalSession 相当于 session.
init-method:指定类中的初始化方法名称。
destroy-method:指定类中销毁方法名称
spring bean的作用域有几种?【面试题】
(1)scope="singleton" (单例对象)只创建一个对象。spring的默认作用域。 获取一个对象初始化一次
(2)scope="prototype"(多例对象) 会创建一个新的对象返回
(3) request 基于web项目的一次请求,将对象存于request域中。使用的对象都是统一的。【一次请求】
(4) session web项目中,spring创建一个bean的对象,存在session域中
(5)global session:全局作用域【Portlet 环境】,其他地方相当于session
Spring bean标签
id(唯一标识)
class(实体类)
scope(作用域:singleton【单例(一个对象时用)】、prototype【多例(多个对象时用)】)
init-method(初始化)(多例,初始化多次)
destroy-method(销毁)
init-method(初始化时指定方法初始化时的名称)【使用:在实体类中创建初始化方法,在bean里添加init-method属性,双引号里写方法名】
destroy-method(销毁)
实例化bean的三种方式【相当于创建bean(对象)】
(1)使用默认无参构造参数【默认】
(2)使用spring静态工厂的方法创建对象(实现类中的方法加static) 【创建静态工厂(java类) 在bean里的标签声明:factory-method("调用静态工厂的方法名")】
(3)使用实例工厂的方法来创建对象(实现类中的方法名不加static)【先用factory-bean标签(实例工厂的id,class写上)声明一个bean(实例工厂),在bean里的标签声明:factory-method("调用实例工厂的方法名")】
依赖注入[DI](三种方式)(建立关系 )【一个bean对象中要用到另一个bean的对象的类里的方法,】 【面试题】
service要用到dao的方法(如:public void savePerson(){personDao.save();})
(1)构造方法(构造器)注入:(在一个类(UserService)中创建另一个类(UserDao)的属性(如:private UserDao userdao;)然后在要创建的对象的类中构造好另一个类的方法:在类中右击找到Generate,然后选Constructor出另一个类(UserDao)的的构造方法。在该类的构造方法里加上另一个类的参数:public UserService(UserDao userDao【index="0"】,PersonDao personDao【index="1"】){this.userDao=userDao;this.personDao=personDao})
在主方法里声明好对象(getBean) 直接用点调出(如:userService.saveUser)
(2)set方法注入:在类里将用到的对象用setter方法set出来(在类中右击找到Generate,然后选Serter出另一个类(UserDao)的的sertter方法。)
然后在bean的property属性标签里声明好name和ref【对象名】有几个setter写几个property
(3)注解方式注入 :((支持注解的方式注入))(@Resource)注解、(@Autowired)注入
使用:在属性上加上注解,如果报错在spring.xml里bean上写和将注解支持加上
@Autowired和@Resource注解的区别?
(目标都是一致的,都是为了注入对象)
@Resource是java本身提供的
@Resource注解装配方式,先按照属性的名字去装配【byNae】,如果匹配不上再按照
Spring包扫描的机制?
(1)配置包扫描的语句,在spring.xml里添加
(2)Spring会扫描所有带有相关注解的类,创建。
(3)哪些注解:@Service @Component(组成、部件)@Repository @Controller【建议:业务层:@Service 持久层:@Repository 控制层:@Controller 其他:@Component】
工程集成spring框架:
控制层:-->servlet -->springmvc
业务层:service-->注解注入
持久层:jdbc->mybatis
pom声明版本号
1、一个servlet只能对应一个请求
(1)servlet多不易维护
(2)参数获取麻烦
servlet+jdbc
springmvc+sprng+mybatis
三层架构:
SpringMVC?
(1)model模型:模型,数据封装【entity,pojo, vo】
(2)view视图:页面 [jsp html]
(3)controller:控制器,请求处理,响应【servlet,springMVC】
springmvc的特点
1、角色划分清晰
前端控制器(DispatcherServlet)
请求到处理器映射(HanderMapping)
处理器适配器(HandlerAdapter)
视图解析器(ViewResolver)
处理器和页面控制器(Controller)
验证器(Validator)
命令对象(Command )
表单对象
2、分工明确
3、功能强大的数据验证、格式化、绑定机制
4、本地化主持解析的支持
5、强大的jsp标签库
4、SpringMvc的集成‘
(1)导入spring的核心包【在pom.xml配置】
(2)配置spring的核心控制器【在web.xml配置】
(3)springMVC注解
①@Controller加在servlet类上,声明是一个控制器
②@RequestMapping【需要配置】
jsp名字不能和servlet的名字一样,不然会优先读取servlet。
SpringMVC集成步骤:
第一步:导入spring的核心包及spring-web.jar spring-web mvc.jar的pom依赖【版本号要和前面用的spring的版本一样】
第二步:配置springMVC和核心配置器,DispatcherServlet 【在web.xml里配】
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:conf/application-springMvc.xml
1
其中还要在conf里加上spring文件 文件名【application-springMvc.xml】
第三步:配置application-springMvc.xml的文件
【com.wojia.controller为控制层(实质还是servlet,但用注解整合成一个servlet总体,一般放在controller文件夹里)】
com.wojia.controller">
【prefix(前缀) suffix(后缀)做拼接view的jsp页面的域名用】
在页面上显示报错信息:在servlet和网页里写如下内容:
addObject添加数据
驼峰映射:数据库sql中下划线后的首字母在实体类中要大写并去掉下划线
Reformat Code:美化代码(将代码对齐缩进)
:勾选框
springMvc的改造demo:
(1)在controller文件夹里创建一个java类作为servlet类的集合,在类上加@Controller的注解,
(2)然后在调用Service用@Resource作为调用service的注解。
(3)然后在方法体里用@RequestMapping("方法体名字")
(4)然后在servlet的方法体里要用到request、response、session在servlet的方法体的括号里调用
(5)将方法体的doget、dopost等方法的内容加进去【可以一个方法一个方法写,也可以根据get和post方法来分开写写】,然后在最后转到jsp页面的语句去掉,加上return ”jsp页面的名字“;
(6)在userservlet类上头加上@RequestMapping(“user”)【路径转到为user的加上到路径的路径】
【转发】return ”jsp页面的名字“;
【重定向】return "redirect:servlet名字";
@RequestParam请求参数的映射,加载形参上,和@param类似
【运行 Artifacts里的war.exploded文件,在lib里加缺少的jar包】
400:请求参数上的错
405:路径的错
500:代码内部的错
单值传参
pojo传参
路径传参
5、SpringMvc注解?
(1)@Controller 加在类上,声明是一个控制器,springmvc可以解析【声明控制器】
(2)@RequestMapping("name") 加在类上或者方法上,是一个请求路径映射的注解【请求路径映射】【可在方法那直接写上后面的路径,放它放在类头上会给路径再分一级:相当于在原路径上再加上父路径 /name/】【为区分层级用】【也可用于实体类和参数映射】【属性:value method 】【@RequestMapping(value=“test”,method=RequestMethod.POST)请求方法GET或POST方法】
(3)@RequestParam 【加在形参上,请求参数和形参映射。】@RequestParam("value=username") String name 【参数映射 加在形参上】【请求(页面)为username,对应数据库的参数名字name】【属性:required:是否必填,默认false,defaultValue为默认值,如果不填,默认值为设定的默认值】【该参数的默认值为5:@RequestParam(defaultValue="5")】[400:参数报错]
@DateTimeFormat【时间注解】
(4)@PathVariable 加在形参上 与路径中的{}配合使用,将路径的值映射到形参上
(5)@RequestBody【加在形参上 目的是将提交过来的json的字符串转换到对应的实体类内】
(6)@ResponseBody 【可加在方法上也可加在类上 加上@ResponseBody注解返回的是具体的数据 如果不加返回是具体的数据】 【将返回的对象转换成json的形式】【需要下json的jar包】
数据传输【传参】:
单值传输
POJO类型(实体类型)传输
路径传输:【位置映射,根据位置映射】
@RequestMapping("testpath/{name}/{age}") 【参数为动态,加花括号的为动态的 能自动匹配】
public String testpath(@PathVariable("name") String name,@PathVariable("age") Integer age){
System.out.println(name+age);
return "sucess";
}