Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。提供了功能强大IOC、AOP及Web MVC等功能。
一、spring基于xml配置开发
实体类
public class Person {
private String name;
private Integer age;
public Person() {
System.out.println("person对象被创建~~~");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1、spring配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.exzample.bean.Person">
<property name="name" value="张三"/>
<property name="age" value="20"/>
</bean>
</beans>
2、启动spring容器
①通过ApplicationContext类加载spring配置文件
//加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//根据xml配置文件中配置的bean标签的id值从spring容器中获得Person对象
Person person1 = (Person) context.getBean("person");
//根据类型从spring容器中获得Person对象
Person person2 = context.getBean(Person.class);
//根据id和类型从spring容器中获得Person对象
Person person3 = context.getBean("person", Person.class);
System.out.println(person1);
System.out.println(person2);
System.out.println(person3);
运行结果如下图所示
如图所示,此时容器中person对象只被创建了一次
②通过BeanFactory加载spring配置文件
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
Person person = (Person) factory.getBean("person");
System.out.println(person);
运行结果如下图所示
两种方式启动spring容器的区别:第一种方式是先将xml配置文件中配置的所有bean创建出来,而第二种方式仅仅只在使用到对应bean时才将其创建出来。
实验代码:
System.out.println("spring容器启动了...");
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("application.xml"));
结果:
System.out.println("spring容器启动了...");
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
结果:
二、spring注解开发
1、配置类
/*
被@Configuration标注的类为spring的配置类,作用与spring的xml配置文件等同
*/
@Configuration
public class MySpringConfiguration {
/**
* 被@Bean注解标注的类等同于原xml配置文件中的<bean></bean>标签
* 方法名字等同于bean标签的id值
* @return
*/
@Bean
public Person person() {
Person person = new Person();
person.setAge(20);
person.setName("张三");
return person;
}
}
2、加载配置类启动spring容器
ApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfiguration.class);
Person person = context.getBean(Person.class);
System.out.println(person);
运行结果:
三、springmvc基于xml配置文件开发
1、maven依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.15.RELEASE</version>
</dependency>
<!--json转换-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2、springmvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描base-package所配置的包及其子包中所有被标有spring注解的类并加载-->
<context:component-scan base-package="com.exzample"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:annotation-driven/>
</beans>
3、web.xml配置
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
当springmvc配置文件名为dispatcherServlet-servlet.xml时且位于WEB-INF文件夹中
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
当web.xml文件没有显示配置读取的配置文件时,默认从WEB-INF文件夹中寻找名为dispatcherServlet-servlet.xml的配置文件
4、测试
①demo目录结构
Person.java
public class Person {
private String name;
public Person(){}
public Person(String name, String password) {
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String password;
}
PersonController.java
import com.haici.bean.Person;
import com.haici.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class PersonController {
@Autowired
private PersonService service;
/**
* 返回值为页面名称
*
* @param name
* @param password
* @return
*/
@RequestMapping("/login")
public String login(String name, String password) {
Person person = service.login(name, password);
if (person != null) {
return "succes";
} else {
return "error";
}
}
/**
* 通过modelAndView.setViewName("succes");设置跳转页面,如不设置默认跳转与方法名一致的页面
* 通过modelAndView.addObject("name", name);将值存放在request域中
*
* @param name
* @param password
* @return
*/
@RequestMapping("/login2")
public ModelAndView login2(String name, String password) {
ModelAndView modelAndView = new ModelAndView();
if ("123".equals(password)) {
modelAndView.addObject("name", name);
modelAndView.setViewName("succes");
return modelAndView;
} else {
modelAndView.setViewName("error");
return null;
}
}
/**
* 默认跳转以 路径+视图解析器的页面,并携带返回对象
*
* @param name
* @param password
* @return
*/
@RequestMapping(value = "/person")
public Person login3(String name, String password) {
Person person = new Person();
person.setName(name);
person.setPassword(password);
return person;
}
@RequestMapping("/toPerson")
public String toPerson() {
//转发
return "forward:/person.do";
}
@RequestMapping("/redirect")
public String redirect() {
//重定向
return "redirect:/person.do";
}
/**
* 标注@ResponseBody注解的方法返回json格式数据
*
* @return
* @GetMapping=@RequestMapping(method = RequestMethod.GET)
*/
@GetMapping("/get")
@ResponseBody
public Person getPerson() {
Person person = new Person();
person.setPassword("123");
person.setName("李四");
return person;
}
@ResponseBody
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
PersonServiceImpl.java
import com.haici.bean.Person;
import com.haici.service.PersonService;
import org.springframework.stereotype.Service;
@Service
public class PersonServiceImpl implements PersonService {
@Override
public Person login(String name, String password) {
if ("zhangsan".equals(name) && "123".equals(password)) {
return new Person(name, password);
} else {
return null;
}
}
}