1.Spring定义
轻量级框架, Java EE的春天,当前主流框架
什么是spring?(面试题)
Spring是一个开源的轻量级的java开发框架。是一种简化应用程序的开发。
在spring出来之前,service层调用dao层都是用new的方式。
在Spring出来之后,service层和dao层都会放在spring容器去管理,
这是spring的第一种特性,我们称之为IOC,控制反转。
Spring还有一种特性, 我们称之为AOP,大白话,“面向切面”,
说白了就是专门的人干专门的事。
在项目很多公有的或是要被重复被调用的模块可以被抽取出来,
利用的就是AOP的特性,例如日志模块。
2.Spring特性
(1)IOC (控制反转,DI:依赖注入)
DI 是 IOC 的具体实现
IOC框架使用依赖注入作为实现控制反转的方式
(2)AOP实现 (面向切面编程)
面试题:spring –IOC,DI体系整理
IOC是一种思想 不负责具体实现 是通过DI依赖注入来实现的
其中又包括各种注入如set注入(属性注入,常见)==》
包括对象、引用类型、属性和属性值等,
还有构造器注入(了解)、注解注入(常见)、
静态工厂注入,动态工厂注入、方法参数注入等等
注入的时候可以采用手工注入 ref(引入),
也可以使用自动注入(非ref)包括byName和byType。
3.Spring组成部分
Spring中的核心思想是什么?(面试题)
在Spring中万物都是Bean组件
(面向Bean编程)(替代new的)
4.Spring理念
面向Bean的编程
5.Spring优势(面试题)
- 低侵入式设计
- 独立于各种应用服务器
- 依赖注入特性将组件关系透明化,降低了耦合度
- 面向切面编程特性允许将通用任务进行集中式处理
- 与第三方框架的良好整合
6.IOC特性
A.非IOC思想
(1)创建maven工程,java,resources,test,并配置路径参数
(2)UserService.java
public interface UserService { void add(); }
(3)UserServiceImpl
public class UserServiceImpl implements UserService {
@Override
public void add() { System.out.println("hello world..."); }
}
(4)TestUserServiceImpl.java
import cn.kgc.service.UserServiceImpl;
import org.junit.Test;
public class TestUserServiceImpl {
@Test
public void testAdd(){ new UserServiceImpl().add(); }
}
B.IOC思想
好处: 少用new 因为要开辟空间
1 2 3 步与前面一致 导入依赖
(4)pom.xml
1 org.springframework spring-context5.3.5
(5)spring配置文件applicationContext.xml
NEW – XML Configuration File – Spring Config
(6) TestUserServiceImpl.java
@Test
public void testAdd(){
//调用启动器 后面放配置文件
//创建Spring容器对象(ClassPathXmlApplicationContext:加载配置文件)
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象 获取Bean 里面写id 并且需要强转
UserService userService = (UserService) ac.getBean("userService");
userService.add();
}
7.DI注入(IOC的实现)
注入: 主要的是 set注入和注解注入。
(1)set注入
1.1-属性赋值
A.实体类User.java
1.1-属性赋值
A.实体类User.java
public class User {
private Integer id;
private String name;
// 省略getter和setter方法
}
B.applicationContext.xml(省略部分)
---->相当于启用命令调用setId()方法 ---->相当于启用命令调用setName()方法
C. TestUserServiceImpl
@Test
public void testUser(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
System.out.println("编码: " + user.getId() + "t" + "名称:" + user.getName());
}
1.2引用类型手工注入(ref方式)
附注:
A.User
public class User {
private Integer id;
private String name;
private Role role;
//省略getter和setter
}
B.Role
public class Role {
private Integer rid;
private String rName;
//省略getter和setter
}
C.applicationContext.xml (省略部分)
D.Test01.java
@Test
public void test1(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
System.out.println("id:" + user.getId() + " role:" +user.getRole().getrName());
}
结果:
=> id:12 role:教授
注意点:
ref 写太多 很繁琐 也要细心 所以需要自动注入1.3 引用类型自动注入
xml中可以在bean元素中通过autowire属性来设置自动注入的方式:
byteName:按照名称进行注入 byType:按类型进行注入 constructor:按照构造方法进行注入 default:默认注入方式 详细说明: spring容器会按照set属性的名称去容器中查找同名的bean对象, 然后将查找到的对象通过set方法注入到对应的bean中, 未找到对应名称的bean对象则set方法不进行注入 注意: 需要注入的set属性的名称和被注入的bean的名称必须一致。
(1)byName
byName(按名称注入):
java类中引用类型的属性名和spring容器中(配置文件)
且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型。
A.User 省略
B.Role 省略
C.applicationContext.xml (省略部分)
D. TestSpring001 省略
结果:
=>id:12 role:教授
(2)byType
byType(按类型注入): java类中引用类型的数据类型和spring容器中(配置文件)的class属性 是同源关系的,这样的bean能够赋值给引用类型 同源就是一类型的意思 三种同源: 第一种同源.java引用类型的数据类型和bean的class的值是一样的 第二种同源.java引用类型的数据类型和bean的class的值是父子类间的关系 第三种同源.java引用类型的数据类型和bean的class的值是接口和实现类的关系(常用)
第一种同源(一致性)
A.User(省略)
B.Role(省略)
C.applicationContext.xml (省略部分)
D. testEntity.java
@Test
public void demo01(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
System.out.println("id:" + user.getId() + " role:" +user.getRole().getrName());
}
结果:
id:13 role:老师
第二种同源(父子类)
A.User(省略)
B.Role(省略)
C.SonRole
public class SonRole extends Role{ }
D. applicationContext.xml (省略部分)
E. testSpring.class
@Test
public void test001(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
System.out.println("id:" + user.getId() + " role:" +user.getRole().getrName());
}
结果:
id:1234 role:金融专家
第三种同源(接口和实现类) (常用)
1.mapper/UserMapper.java
public interface UserMapper { public void add(); }
2.mapper/UserMapperImpl.java
public class UserMapperImpl implements UserMapper {
@Override
public void add() {
System.out.println("持久层UserMapper的add方法。。。。");
}
}
3.service/UserService.java
public interface UserService { public void add(); }
4.service/UserServiceImpl
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
@Override
public void add() { userMapper.add(); }
public UserMapper getUserMapper() { return userMapper; }
public void setUserMapper(UserMapper userMapper) { this.userMapper = userMapper; }
}
5.applicationContext.xml (省略部分)
6.TestUserServiceImpl.java
@Test
public void demo01(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) ac.getBean("userService");
userService.add();
}
}
结果:
持久层UserMapper的add方法。。。。
拓展(第三种同源换成byName方式实现)
applicationContext.xml (省略部分)
题外话:
MVC框架模式 Model View(jsp) Controller 模型-视图-控制器 SpringMVC框架 该框架是基于Java的实现了 MVC框架模式的请求驱动类型的轻量级框架。 MVC 和 SpringMVC不是一样的 SpringMVC是根据spring的 java三者区别 JAVA SE 个人版java 无 WEB端 JAVA ME 客户应用端(已淘汰) –》电脑游戏 JAVA EE web端 JAVA(企业级JAVA)



