1、传统Spring中的问题
第一 层与层之间紧密耦合,接口与具体实现类之间进行紧密耦合
解决方法:不要手动new对象,将此过程交给spring容器进行管理
第二 通用事务与通用日志功能耦合在业务代码中
解决方法:也是交给spring容器进行管理,但是在进行管理的时候,进行了增强此方法,,此增强方法中也增强了事务与日志功能。在找第三方要bean对象的时候,实际是调用了proxy的设计模式。
IOC、AOP、DI
IOC就是将自己手动new的对象,交给spring容器进行管理,在调用该对象的时候,直接找spring容器进行索要
DI中文为依赖注入,用来强调bean容器之间的关系,之间的过程由第三方进行管理
AOP面向切面编程 对某一个bean进行增强,在不改变原来属性的基础上进行方法增强
BeanFactory
导入第三方Spring的jar包或是maven的坐标
bean类既是定义的UserService接口和UseServiceImpl的实现类
配置清单即bean的xml文件,用来设置想要设置的bean类
编写测试类
spring各层的作用
dao(数据访问对象)层:该目录存放与数据库进行交互的代码,包括各种数据操作接口和相关实现类。DAO层主要负责封装对数据库的增删改查操作,并提供给Service层调用。
service(服务层)层:在该目录下,你可以找到处理业务逻辑的代码,包括各种业务逻辑接口和相关实现类。Service层负责处理具体的业务需求,对外提供统一的业务接口,同时调用DAO层进行数据访问和持久化。
mapper(数据映射) 层:该目录主要用于定义数据库表与Java对象之间的映射关系。使用一种常见的技术,如MyBatis等,将数据库表的字段映射为Java对象的属性,以便进行对象与数据库之间的转换。
impl(实现类)层:在dao和service目录下都可能存在impl目录。这些目录存放对应接口的具体实现类。通过将接口和实现类分离,可以提高代码的可维护性和扩展性。
controller(控制器层)层:该目录存放处理请求和响应的代码,负责接收用户请求并将其转发到对应的业务逻辑处理。Controller层主要负责解析参数、调用Service层进行处理,并返回给前端合适的响应结果。
Bean的三种实例化方式(xml方式):
静态工厂模式、实例工厂工厂模式、构造方法实现
静态工厂模式
建立factorybean的类名,建立静态的方式,
public class OrderDaoFactory {
public static OrderDao getorderdao(){
return new OrderDaoImpl();
}
}
在xml文件中设置bean
使用factory-method="getorderdao"引用设置的方法
在测试类中输出orderDao中的方法
实例工厂模式
使用静态工厂和实例工厂的区别是进行xml文件配置的时候,书写的方式不同
//实例工厂
<bean name="userfactory" class="com.by.OrderDaoFactory"></bean>
<bean name="orderDao" factory-bean="userfactory" (//实例)factory-method="getorderdao"></bean>
使用构造方法实例化bean
//dao层
public interface OrderDao {
public void save();
}
//dao实现层
public class OrderDaoImpl implements OrderDao {
@Override
public void save() {
System.out.println("实现的是OrderDao中的save方法");
}
}
//Application.xml配置
<bean name="orderDao" class="com.by.dao.impl.OrderDaoImpl" >
进行测试
ApplicationContext sc = new ClassPathXmlApplicationContext("Application.xml");
OrderDao orderDao = sc.getBean("orderDao", OrderDao.class);
orderDao.save();
静态工厂和实例化工厂的区别
在bean的实例化中,可以使用静态工厂方法和实例化工厂方法来创建bean对象。这两种方式有一些区别。
-
静态工厂方法:
-
静态工厂方法是定义在一个具体的类中,并且该方法是静态方法,不需要创建类的实例即可调用。
-
这种方式提供了更好的封装性,因为它将创建bean的逻辑封装在一个类中,并通过静态方法进行访问。
-
可以命名静态工厂方法来描述创建的bean对象(例如
MyBeanFactory.createBean()
)。 -
可以在创建实例之前执行一些额外的逻辑,例如验证参数、缓存实例等。
-
静态工厂方法可以返回bean的子类型,从而提供更大的灵活性。
-
-
实例化工厂方法:
-
实例化工厂方法是定义在一个普通的类中,并且该方法是非静态方法,需要通过创建类的实例来调用。
-
这种方式允许在创建bean实例时使用某些状态或依赖关系。通过实例化工厂方法,可以在每次调用时返回不同的实例。
-
实例化工厂方法可能会创建多个实例,因此可能会导致内存消耗较大。
-
在实例化工厂方法中,可以使用其他实例的方法和属性来创建bean对象。
-
总体而言,静态工厂方法适用于简单的创建场景,提供更好的封装性,并且可以返回子类型。而实例化工厂方法则适用于需要使用其他实例或状态进行创建的复杂场景。选择哪种方式取决于具体的需求和设计偏好。
Bean的生命周期
实例化 配置 初始化 使用 销毁
三种实例化的方式(参考上边)
配置就是在测试类文件中,使用spring容器装配之后,需要导入的bean的类
//创建beans.xml的配置文件 在这里边进行实例化
ApplicationContect ac = new ApplicationContext("beans.xml")
//进行bean的配置 我这里是建立的OrderDao的接口与OrderDaoImpl的实现类
sc.getBean("orderDao", OrderDao.class).var
初始化(init)
在xml文件中的bean中设置init-method和destrou-method方法
<bean name="orderDao" class="com.by.dao.impl.OrderDaoImpl" init-method="init" destroy-method="destroy" ></bean>
在实现类中定义这俩个方法
public void init(){
System.out.println("bean初始化");
}
public void destroy(){
System.out.println("bean被销毁");
}
Bean的作用域
使用scope关键字设置
-
单例(Singleton)作用域:这是默认的作用域,在整个应用程序中只创建一个实例,并且每次请求都返回相同的实例。这对于共享状态的对象非常有用。
-
原型(Prototype)作用域:每次请求都会创建一个新的实例,因此每次都会得到一个不同的对象。原型作用域适用于那些需要多个相互独立实例的情况。
-
请求(Request)作用域:每个 HTTP 请求都会创建一个新的实例,该实例仅在当前请求期间有效。适用于 Web 应用程序中需要与每个请求相关的对象。
-
会话(Session)作用域:每个用户会话将创建一个新的实例,该实例在整个用户会话期间有效。适用于需要跟踪用户状态和数据的情况。
-
全局会话(Global Session)作用域:类似于会话作用域,但它在集群环境下可以跨多个用户会话共享一个实例。适用于需要全局状态和数据共享的场景。
其它知识
基础框架:spring spring mvc mybaits
服务框架:MQ、ES、Nacos等
问题
使用maven项目的时候,导入的架包,即使用spring框架??
No pom文件中导的包是spring的核心配置,使用spring框架感觉就是使用下边这句话进行最终设置
ApplicationContect ac = new ApplicationContext("beans.xml")
在idea更新之后