- 一、IOC(控制反转)
- 二、Spring Bean管理
- 基于xml配置方式
- Xml配置方式依赖注入[DI:Dependency Injection]
- 注解方式实现
- 注解与XML的对比
- 三、Spring JDBC
- 不使用AOP的开发方式
读作“反转控制”(Inverse of Control)更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
IOC容器是具有依赖注入功能的容器,负责对象的实例化,对象的初始化,对象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等操作。对象的整个生命周期都是由容器来控制。我们需要使用的对象都由ioc容器进行管理,我们不需要手动去new的方式去创建对象,由ioc容器帮我们组装好,当我们需要使用的时候直接从ioc容器中直接获取就可以了。
正控:若要使用某个对象,需要自己去负责对象的创建。
反控:若要使用某个对象,只需要从spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。
目的:降低耦合度
底层实现方式:解析xml /扫描注解标签 + 工厂模式 + 反射机制
配置类,spring对其管理
id:生成对象标识
class:类的地址
name:对象别名
scope:范围,作用域
singleton:单例的,整个应用程序只创建一次,多次获取同一个,在spring容器启动时创建
prototype:原型的(多例的) 每次获取时,都会创建一个新对象–>
Xml配置方式依赖注入[DI:Dependency Injection]
指Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象。
实现IOC需要DI做支持
两种方法:
(1)构造方法
(2)set方法
eg:
测试:
ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml");
User user = app.getBean("user", User.class);
System.out.println(user);
User user1 = app.getBean("user1", User.class);
System.out.println(user1);
1
2
需要依赖注入
测试:
调用了set方法
User user2 = app.getBean("user2", User.class);
System.out.println(user2);
UserService
package com.ffyc.spring.service;
import com.ffyc.spring.dao.UserDao;
public class UserService {
private UserDao userDao;
public void userService(){
userDao.savedao();
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
System.out.println("set方法被调用");
}
}
User
package com.ffyc.spring.modle;
import java.util.List;
public class User {
private String name;
private Integer age;
private List list;
public User() {
System.out.println("user无参构造");
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + ''' +
", age=" + age +
", list=" + list +
'}';
}
}
UserDao
package com.ffyc.spring.dao;
public class UserDao {
public void savedao(){
System.out.println("保存UserDao");
}
}
注解方式实现
注解开发准备工作
注解需要的jar包,注解功能封装在AOP包,导入 Spring aop jar包即可
@Component(value = "user") //注解创建对象
@Scope(value = "singleton单例") //生成对象的策略 singleton单例 prototype 原型
public class User {
private String name;
private Integer age;
private List list;
}
@Repository(value = "userDao") //注解创建对象
public class UserDao {
}
@Autowired 是spring自身提供的注释标签
@Resource(name = “userDao”) JDK自身提供注解标签 byName 和 byType 两种注入方式
@Service(value = "userService") //注解创建对象
public class UserService {
@Autowired
private UserDao userDao;
public void saveUser(){
userDao.savedao();
}
}
注解与XML的对比
注解
优点: 方便,直观,高效(代码少,没有配置文件的书写复杂)
缺点:以硬编码的方式写入到Java代码中,修改是需要重新编译代码的。
XML
优点:配置和代码是分离的,在xml中做修改,无需编译代码,只需重启服务器即可将新的配置加载。
缺点:编写麻烦,效率低。
Spring是一个一站式框架,自身也提供了控制层的SpringMVC 和持久层的Spring jdbcTemplate。
开发步骤
1、下载 Spring JdbcTemplate 的 jar 包
org.springframework spring-jdbc 5.2.2.RELEASE com.alibaba druid 1.1.10
2、导入属性文件
config.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai uname=root psword=123
在db.xml中读入config.properties文件
3、管理数据源对象
spring管理与数据库链接(数据源)
4、在配置文件中创建jdbcTemplate
在类中获得jdbcTemplate 对象,就可以直接使用
@Autowired
JdbcTemplate jdbcTemplate;
JdbcTemplate中常用的方法:
execute :无返回值,可执行ddl ,增删改语句
update :执行新增,修改,删除
queryForXXX:执行查询相关语句
eg:
package com.ffyc.spring.dao;
import com.ffyc.spring.modle.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@Repository(value = "userDao_back")
public class UserDao_back {
@Autowired
JdbcTemplate jdbcTemplate;
public void savedao(){
//System.out.println("保存save");
// jdbcTemplate.update("insert into admin(account,password,sex)values (?,?,?)","122","222","男");
//创建一个表
//jdbcTemplate.execute("create table student(id int)");
//查询
//查询多个Rowmapper
Admin admin= jdbcTemplate.queryForObject("select account,password from admin where id =?", new Object[]{1}, new
RowMapper() {
@Override
public Admin mapRow(ResultSet resultSet, int i) throws SQLException {
Admin admin =new Admin();
admin.setAccount(resultSet.getString("account"));
admin.setPasswod(resultSet.getString("password"));
return admin;
}
});
System.out.println(admin);
//不建议用 map
List
修改信息
创建一个student表
查询employee表有几条数据
查询admin表单个信息;查询employee表所有信息
先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非业务方法。非业务方法也称为交叉业务逻辑:
doTransaction(): 用于事务处理
doLog() : 用于日志处理
然后再使接口方法调用他们。接口方法也称为主业务逻辑。



