官网:https://spring.io/
理念:使现有技术更加实用,本身是大杂烩整合现有的框架技术
优点:
- 轻量级框架
- Ioc 容器-控制反转 inversion of Control
- Aop 面向切面编程
- 对事务支持
- 对框架的支持
Ioc 是一种编程思想,由主动编程变为被动接收
别名:依赖注入 dependency injection
控制: 指谁来控制对象的创建 传统的应用程序对象的创建是由程序本身控制的 使用 spring 之后,由 spring 创建对象
反转: 正转指程序来创建对象 反转指程序本身不创建对象,而变成被动接受对象
总结: 以前对象是由程序本身创建, 使用 spring 之后,程序变为接收 spring 创建好的对象
简单示例1、依赖 pom.xml
org.springframework
spring-context-support
5.2.6.RELEASE
org.springframework
spring-context
5.2.6.RELEASE
2、Person.java
package com.pengshiyu.bean;
public class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + this.name);
}
}
3、beans.xml
此处是完整写法,之后将采用简写形式
4、Demo.java
package com.pengshiyu.spring;
import com.pengshiyu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
public static void main(String[] args) {
// 解析beans.xml 文件,生成对应的Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person)context.getBean("person");
person.sayHello();
}
}
二、Dao 管理示例
Ioc: 对象由 spring 来创建
1、UserDao
package com.spring.dao;
public interface UserDao {
public void getUser();
}
2、UserDaoMysqlImpl
package com.spring.dao.impl;
import com.spring.dao.UserDao;
public class UserDaoMysqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("Mysql 获取用户信息");
}
}
3、UserDaoOracleImpl
package com.spring.dao.impl;
import com.spring.dao.UserDao;
public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println("Oracle 获取用户信息");
}
}
4、UserService
package com.spring.service;
public interface UserService {
public void getUser();
}
5、UserServiceImpl
package com.spring.service.impl;
import com.spring.dao.UserDao;
import com.spring.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao = null;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
this.userDao.getUser();
}
}
6、beans.xml(简化版)
7、TestDemo
package com.spring.test;
import com.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService)context.getBean("service");
service.getUser();
}
}
三、使用 Ioc 来创建对象的 3 种方法
Person 类
package com.pengshiyu.bean;
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + this.name);
}
}
创建对象
package com.spring.test;
import com.pengshiyu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person) context.getBean("person");
person.sayHello();
}
}
beans.xml(简化版)
1、无参构造
2、有参构造
(1)根据参数下标设置
(2)根据参数名称设置
(3)根据参数类型设置
3、工厂方法创建
(1)静态工厂
package com.pengshiyu.factory;
import com.pengshiyu.bean.Person;
public class PersonFactory {
public static Person newInstance(String name) {
return new Person(name);
}
}
(2)动态工厂
package com.pengshiyu.factory;
import com.pengshiyu.bean.Person;
public class PersonFactory {
public Person newInstance(String name) {
return new Person(name);
}
}
注意静态工厂 static
id 是 bean 的唯一标识符,如果没有配置 id,name 默认为标识符
如果配置了 id,又配置了 name,则 name 是别名 name 可以设置多个别名分隔符可以是空格、逗号、分号
class 是 bean 的全限定名=包名+类名 如果不配置 id 和 name,那么可以可以使用如下方式获取对象
applicationContext.getBean(class)
配置如下
获取方式
Person person = (Person) context.getBean("person1");
// 或者
Person person = (Person) context.getBean("user");
// 或者
Person person = (Person) context.getBean(Person.class);
导入文件
五、Spring 依赖注入 DI
dependency injection 依赖:指 bean 对象创建依赖于容器,bean 对象的依赖资源
注入:指 bean 对象依赖的资源由容器来设置和装配
spring 注入
测试
package com.spring.test;
import com.pengshiyu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person) context.getBean("person");
person.sayHello();
}
}
- 构造器注入
package com.pengshiyu.bean;
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + this.name);
}
}
- setter 注入
(1)常量注入
package com.pengshiyu.bean;
public class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + this.name);
}
}
(2)bean 注入
package com.pengshiyu.bean;
public class Address {
private String address;
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
package com.pengshiyu.bean;
public class Person {
private String name;
private Address address;
public void setAddress(Address address) {
this.address = address;
}
public void setName(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + this.name + this.address.getAddress());
}
}
(3)数组注入
package com.pengshiyu.bean;
public class Book {
private String name;
public Book(String name){
this.name = name;
}
@Override
public String toString() {
return "《" + this.name + "》";
}
}
package com.pengshiyu.bean;
import java.util.Arrays;
public class Person {
private Book[] books;
public void setBooks(Book[] books) {
this.books = books;
}
@Override
public String toString() {
return "Person{" +
"books=" + Arrays.toString(books) +
'}';
}
}
水浒传
红楼梦
三国演义
西游记
(4)List 注入
package com.pengshiyu.bean;
import java.util.Arrays;
import java.util.List;
public class Person {
private List[] books;
public void setBooks(List[] books) {
this.books = books;
}
@Override
public String toString() {
return "Person{" +
"books=" + Arrays.toString(books) +
'}';
}
}
水浒传
红楼梦
三国演义
西游记
(5)Map 注入
package com.pengshiyu.bean;
import java.util.Map;
public class Person {
private Map cards;
public void setCards(Map cards) {
this.cards = cards;
}
@Override
public String toString() {
return cards.toString();
}
}
(6)Set 注入
package com.pengshiyu.bean;
import java.util.Set;
public class Person {
private Set games;
public void setGames(Set games) {
this.games = games;
}
@Override
public String toString() {
return games.toString();
}
}
英雄联盟
王者荣耀
(7)null 注入
package com.pengshiyu.bean;
public class Person {
public void setWife(String wife) {
this.wife = wife;
}
private String wife;
@Override
public String toString() {
return wife;
}
}
(8) Properties 注入
package com.pengshiyu.bean;
import java.util.Properties;
public class Person {
private Properties props;
public void setProps(Properties props) {
this.props = props;
}
@Override
public String toString() {
return this.props.toString();
}
}
Tom
Man
(9) p 命名空间注入 需要有对应的 set 方法
package com.pengshiyu.bean;
public class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
头文件需要引入
xmlns:p="http://www.springframework.org/schema/p"
(10)c 命名空间注入 要求有对应的构造方法
package com.pengshiyu.bean;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
头文件需要引入
xmlns:c="http://www.springframework.org/schema/c"
六、bean 的作用域
spring
桥梁
轻量级
易学
ioc di
app
事务
整合框架
scope:
- singleton 单例 整个容器只有一个对象实例(默认)
- prototype 原型 每次获取 Bean 都产生一个新对象
- request 每次请求时创建一个新的对象
- session 会话范围内有一个对象
- global session 只在 portlet 下有用,表示 applicatio
- application 在应用范围中有一个对象
autowire
- byName
- byType
- constructor
不推荐使用自动装配