简述Spring框架(一)

Abina ·
更新时间:2024-11-14
· 958 次阅读

本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。

Spring概述

什么是spring
Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programmaing:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
spring的优点

方便解耦,简化开发
通过Spring提供的IOC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的耦合。用户也不再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。 AOP编程的支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。 声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可以做的事情。 方便集成各种优秀框架
Spring可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。 降低JavaEE API的使用难度
Spring对JavaEE API(如JDBC、JavaMail、远程调用等等)进行了薄薄的封装层,是这些API的使用难度大大降低。 Java源码是经典学习的典范
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现这大师对Java设计模式灵活运行以及对Java技术的高深造诣。它的源代码无意是Java技术的最佳实现的范例。

spring的体系结构

创建持久层接口并创建实现该接口的实现类。 public interface AccountDao { void saveAccount(); } public class AccountDaoImpl implements AccountDao { @Override public void saveAccount() { System.out.println("保存成功!"); } } 创建服务层接口并创建实现该接口的实现类。 public interface AccountService { void saveAccount(); } public class AccountServiceImpl implements AccountService { private AccountDao dao; @Override public void saveAccount() { dao.saveAccount(); } } 创建表现层,并添加测试类。 public class AccountDemo { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); AccountService service = ac.getBean("accountService", AccountServiceImpl.class); AccountDao dao = (AccountDao) ac.getBean("accountDao"); System.out.println(service); System.out.println(dao); } }

在这里插入图片描述
使用静态工厂的方法创建对象。 public class StaticFactory { public static AccountDao creatAccountDao() { return new AccountDaoImpl(); } } 使用实例工厂的方法创建对象。 public class InstanceFactory { public AccountDao createAccountDao() { return new AccountDaoImpl(); } }

spring的依赖注入
依赖注入,Dependency Injection,它是spring框架核心ioc的具体体现。在我们程序编写时,,通过控制反转把对象创建并注入到容器中,ioc解耦只是降低程序间的耦合,并不会消除,如果代码中出现依赖关系,那我们怎么解决呢?例如我们的业务层调用持久层。简单地说,就是坐等框架把持久层对象传入到业务层,而不是用我们自己去获取持久层对象。

构造函数注入:就是使用类中的构造函数给成员变量赋值,注意:赋值的操作不是我们自己做的,而是通过配置的方式,让spring框架为我们注入。 constructor-arg:构造函数注入,在bean标签内部,它有以下属性: type:用于指定要注入数据的数据类型,该类型也是构造函数中某个或某些参数的类型。 index:用于给构造函数中指定的索引位置的参数进行赋值,所以从0开始。 name:用于给构造函数中指定名称的参数赋值,这个也是最常用的。 value:用于给基本数据类型和String类型进行赋值。 ref:用于指定其他bean类型的数据,指的是在spring中IOC核心容器中出现过的对象。 public class AccountServiceImpl implements AccountService { private String name; private int age; private Date birthday; public AccountServiceImpl(String name, int age, Date birthday) { this.name = name; this.age = age; this.birthday = birthday; } @Override public void saveAccount() { System.out.println(name + ":" + age + ":" + birthday); } }

测试并查看结果

public class AccountDemo { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); AccountService service = ac.getBean("accountService", AccountServiceImpl.class); service.saveAccount(); }

在这里插入图片描述

property:使用set方法注入,注意使用该方法时,要注入的类中要含有无参构造器,因为spring是通过无参构造器反射出对象,之后使用set方法进行赋值。 name:找的是类中set方法后面的部分,并且首字母小写,例如:setUsername,则写username即可。 ref:给其他引用类型赋值。 value:给基本数据类型和String类型进行赋值。

注入集合属性
对类中的集合成员进行赋值,这里同样使用set方法注入。

public class AccountServiceImpl implements AccountService { private String[] myStrs; private List myList; private Set mySet; private Map myMap; private Properties myProps; public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List myList) { this.myList = myList; } public void setMySet(Set mySet) { this.mySet = mySet; } public void setMyMap(Map myMap) { this.myMap = myMap; } public void setMyProps(Properties myProps) { this.myProps = myProps; } @Override public void saveAccount() { System.out.println("myStrs:" + Arrays.toString(myStrs)); System.out.println("myList:" + myList); System.out.println("mySet:" + mySet); System.out.println("myMap:" + myMap); System.out.println("myProps:" + myProps); } } myStrsA myStrsB myStrsC myListA myListB myListC mySetA mySetB mySetC AAA BBB

在这里插入图片描述


作者:灰灰渣



spring spring框架

需要 登录 后方可回复, 如果你还没有账号请 注册新账号