Spring学习笔记(一) Spring概述
目的:
范围:任何java的应用
重点:
**IoC(控制反转)**:促进了松耦合,对象初始化时不等对象请求就主动将依赖传递
**AOP(面向切面编程)**:允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发
优点:
缺点:
配置太过于繁琐!(SpringBoot会很好的解决这个问题)
总结:反正无敌!!就是学:smile:!
Spring的7大模块
1.Spring Code 这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。
2.Sping AOP Spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在Spring应用中实现切面编程的基础。它的目标是通过定义一组共同的接口和组件来促进AOP的使用以及不同的AOP实现之间的互用性。
3.Spring Context 核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。另外,这个模块提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持。
4.Spring DAO 使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。另外,这个模块还使用了Spring的AOP模块为Spring应用中的对象提供了事务管理服务。
5.Spring ORM 对那些更喜欢使用对象/关系映射工具而不是直接使用JDBC的人,Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案
6.Spring Web Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。
7.Spring MVC Spring为构建Web应用提供了一个功能全面的MVC框架,Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。
Spring IOC 1.什么是IOC 控制反转模式(也称作依赖性注入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。
1.1个人理解: 就类似于工厂模式里面的工厂,对程序进行了一定的解耦
!
这样降低了app对资源的依赖,直接对工厂要。这样app对资源的控制权进行放弃转而为让第三方(框架)控制资源所以IOC被称为控制反转
1.2作用: 削减计算机程序的耦合(解除我们代码中的依赖关系)
简而言之:对象由spring 来创建,管理,装配!就只需要改成xml来实现不同操作!
Spring IoC容器的使用 org.springframework.beans和org.springframework.context是Spring框架中IoC容器的基础,BeanFactory接口提供一种高级的配置机制能够管理任何类型的对象。
1.Spring 的主要maven依赖 1 2 3 4 5 6 7 8 9 10 11 12 <dependency > <groupId > org.springframework</groupId > <artifactId > spring-webmvc</artifactId > <version > 5.3.3</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-jdbc</artifactId > <version > 5.3.3</version > </dependency >
2.初步的使用 2.1创建bean.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 <?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 ="accountService" class ="com.wht.service.impl.AccountServiceImpl" > </bean > <bean id ="accountDao" class ="com.wht.dao.impl.AccountDaoImpl" > </bean > </beans >
2.2获取对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class Client { public static void main (String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml" ); AccountService as = (AccountService) ac.getBean("accountService" ); AccountDao adao = ac.getBean("accountDao" , AccountDao.class); } }
3.Spring对bean的管理细节 3.1 创建bean的三种方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <bean id ="accountService" class ="com.wht.service.impl.AccountServiceImpl" > </bean > <bean id ="accountDao" class ="com.wht.dao.impl.AccountDaoImpl" > </bean > <bean id ="instanceFactory" class ="com.wht.Factory.InstanceFactory" > </bean > <bean id ="accountService" factory-bean ="instanceFactory" factory-method ="getAccountService" > </bean > <bean id ="accountService" class ="com.wht.Factory.StaticFactory" factory-method ="getAccountService" > </bean >
3.2 bean对象的作用范围
3.3 bean对象的生命周期
4.依赖注入 依赖关系的管理: 以后都交给spring来维护在当前类需要用到其他类的对象,由spring为我们提供,只需要配置文件中说明. 依赖关系的维护就叫做依赖注入。
4.1能注入的类型
基本类型和String
其他bean类型(在配置文件中或者注解配置过得bean)
复杂类型/集合类型
4.2 注入的方式 4.2.1使用构造函数注入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <bean id ="accountService" class ="com.wht.service.impl.AccountServiceImpl" > <constructor-arg name ="name" value ="test" > </constructor-arg > <constructor-arg name ="age" value ="18" > </constructor-arg > <constructor-arg name ="birthday" ref ="now" > </constructor-arg > </bean > <bean id ="now" class ="java.util.Date" > </bean >
4.2.2 使用set方法注入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <bean id ="accountService2" class ="com.wht.service.impl.AccountServiceImpl2" > <property name ="name" value ="test" > </property > <property name ="age" value ="20" > </property > <property name ="birthday" ref ="now" > </property > </bean >
4.2.3 复杂类型的注入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <bean id ="accountService3" class ="com.wht.service.impl.AccountServiceImpl3" > <property name ="myStrs" > <array > <value > AAA</value > <value > BBB</value > <value > CCC</value > </array > </property > <property name ="myList" > <list > <value > AAA</value > <value > BBB</value > <value > CCC</value > </list > </property > <property name ="mySet" > <set > <value > AAA</value > <value > BBB</value > <value > CCC</value > </set > </property > <property name ="myMap" > <map > <entry key ="TestA" value ="aaa" > </entry > <entry key ="TestB" > <value > BBB</value > </entry > </map > </property > <property name ="myProps" > <props > <prop key ="testC" > ccc</prop > <prop key ="testD" > ddd</prop > </props > </property > </bean >
4.2.4 使用注解注入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 @Component("accountService") public class AccountServiceImpl implements AccountService { @Resource(name="accountDao") private AccountDao accountDao =null ; public void saveAccount () { } }
使用java类作为配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 @Configuration @ComponentScan("com.wht") @Import(JdbcConfig.class) @PropertySource("classpath:jdbcConfig.properties") public class SpringConfig {}
5.spring整合junit 5.1导入spring整合junit的依赖 1 2 3 4 5 <dependency > <groupId > org.springframework</groupId > <artifactId > spring-test</artifactId > <version > 5.3.3</version > </dependency >
5.2 相关注解的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class) public class AccountServiceTest { @Autowired private AccountService as = null ; @Test public void testFindAll () { List<Account> allAccount = as.findAllAccount(); System.out.println(allAccount); } @Test public void testFindOne () { Account accountById = as.findAccountById(1 ); System.out.println(accountById); } @Test public void testSave () { as.saveAccount(new Account(null ,"李倩" ,10000 )); }@Test public void testUpdate () { as.updateAccount(new Account(1 ,"666" ,10000 )); }@Test public void testDelete () { as.deleteAccount(2 ); } }