前言
记录自己的学习历程
认识Spring框架
逻辑层开发的流行框架Spring
特点:
-
非侵入性
Spring框架的API不会在业务逻辑上出现
对于应用来说,能将业务逻辑从当前应用中剥离出来
针对框架来说,业务逻辑可言从Spring框架快速移植到其他框架 -
容器
容器功能可以管理对象的生命周期、对象间的依赖关系
可以写一个配置文件(xml文件)定义对象的名字、是否为单例、设置与其他对象的依赖关系 -
IOC
控制反转,即依赖关系的转移,如果以前是依赖实现,现在反转为依赖于抽象,核心思想是面对接口编程 -
依赖注入
对象与对象之间依赖关系的实现 -
AOP(面对切面编程)
将日志、安全、事务管理等服务理解成一个“切面”,可以实现复用,将切面动态插入业务逻辑中,让业务逻辑能够方便使用切面提供的服务
具体内容解释:大佬的Spring教学
Spring框架的内容
- Spring Core作为依赖注入容器的部分
- Spring AOP声明式事务
- Spring ORM对Hibernate等持久层框架提供支持
- Spring Context为企业级开发提供了便捷和集成的工具
- Spring Web为Web应用程序开发提供支持
简单应用
1.在IDEA中创建项目
2.简单应用
(1)HelloWorld类
package com;
public class HelloWorld {
private String userName;
public void setUserName(String userName){
this.userName=userName;
}
public void show(){
System.out.print(userName+":欢迎学习Spring");
}
}
(2)applicationContext.xml
通过bean元素实例化Helloworld类,id属性标识实例名helloworld,class属性指定待实例化的全路径类名,property为类属性赋值
<?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="helloworld" class="com.HelloWorld">
<property name="userName" value="zhangsan"></property>
</bean>
(3)测试类TestHelloWorld
package com.show;
import com.HelloWorld;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestHelloWorld {
public static void main(String [] args){
//加载xml配置
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//获得配置中的实例
HelloWorld helloWorld=(HelloWorld)ctx.getBean("helloworld");
//调用方法
helloWorld.show();
}
}
(4)测试
理解Spring核心机制:依赖注入/控制反转
(1)当java实例需要另一个java实例时,传统方法是调用者来创建被调用者的实例(new获得实例),采用依赖注入,被调用者的实例由Spring容器来完成,然后注入调用者
(2)面向接口编程:定义组件接口,独立开发各个组件,根据组件的依赖关系组装运行
实例理解(一个简单的登录验证)
(1)创建一个接口UserDao
package com.Dao;
public interface UserDao {
public boolean login(String loginName,String loginPwd);
}
(2)接口UserDao的实现类UserDaoImpl
用户名为admin,密码为123456就登录成功
package com.Dao.Impl;
import com.Dao.UserDao;
public class UserDaoImpl implements UserDao {
@Override
public boolean login(String loginName, String loginPwd) {
if (loginName.equals("admin")&&loginPwd.equals("123456")){
return true;
}
else return false;
}
}
(3)Service层
用Service接口就是为了解耦,解耦说的意思是更改某一层代码,不会影响其他层代码,即面向接口编程
Service类封装业务流程,DAO类封装对持久层的访问
最终项目表现为表示层调用控制层,控制层调用业务层,业务层调用数据访问层
package com.Dao.Service;
public interface UserService {
public boolean login(String loginName,String loginPwd);
}
(4)创建接口UserService的实现类UserServiceImpl
package com.Dao.Impl;
import com.Dao.Service.UserService;
import com.Dao.UserDao;
public class UserServiceImpl implements UserService {
UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao=userDao;
}
@Override
public boolean login(String loginName, String loginPwd) {
return userDao.login(loginName,loginPwd);
}
}
在上述代码中没有采用传统的new UserDaoImpl()的方式获取数据访问层UserDaoImpl类的实例,只用了UserDao接口声明了对象userDao,并添加了set()方法,用于依赖注入
UserDaoImpl类的实例化和对象UserDao的注入在xml中完成
(4)配置xml文件
用bean标记配置相关属性
<!--创建userDapImpl的实例-->
<bean id="userDao" class="com.Dao.Impl.UserDaoImpl">
</bean>
<!--配置UserServiceImpl的实例-->
<bean id="userService" class="com.Dao.Impl.UserServiceImpl">
<!--依赖注入数据访问层组件-->
<property name="userDao" ref="userDao"></property>
</bean>
bean元素创建了UserDaoImpl的实例
另一个bean元创建了UserServiceImpl的实例,使用property的name属性设置为userDao,代表UserServiceImpl类中userDao属性需要注入值,通过ref或value指定,ref表示对IOC容器中某个bean实例的引用,这里引用了UserDaoImpl的实例
(5)测试类(TestLogin)
package com.show;
import com.Dao.Service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestLogin {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml ");
//获取配置中UserServiceImpl的实例
UserService userService=(UserService)ctx.getBean("userService");
boolean flag=userService.login("admin","123456");
if(flag){
System.out.print("登录成功");
}
else System.out.print("登录失败");
}
}
可以得到结果:
在测试类中,通过ClassPathXmlApplicationContext类加载Spring配置文件xml,从配置文件中获得UserServiceImpl类的实例,最后调用login()方法,运行测试类,控制台输出