1.Spring 框架的一个关键组件是面向切面的编程(AOP)框架。面向切面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。在软件开发过程中有各种各样的很好的切面的例子,如日志记录、审计、声明式事务、安全性和缓存等。
2.在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是切面。依赖注入帮助你对应用程序对象相互解耦合,AOP 可以帮助你从它们所影响的对象中对横切关注点解耦。
3.AOP 概念和术语

4.Spring 方面可以使用下面提到的五种通知工作:
5.NP就是Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。而如果任何一个NP问题都能通过一个多项式时间算法转换为某个NP问题,那么这个NP问题就称为NP完全问题(Non-deterministic Polynomial complete problem)。NP完全问题也叫做NPC问题。
6.Spring JDBC 框架,在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等。但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。
7.数据访问对象(DAO),DAO 代表常用的数据库交互的数据访问对象。DAOs 提供一种方法来读取数据并将数据写入到数据库中,它们应该通过一个接口显示此功能,应用程序的其余部分将访问它们。
在 Spring 中,数据访问对象(DAO)支持很容易用统一的方法使用数据访问技术,如 JDBC、Hibernate、JPA 或者 JDO。
8.416. 分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
解题思路:可以将问题转换为01背包问题,从数组中选取元素,使元素的和恰好等于数组中所有元素和的一半。创建二维数组dp[i][j],如果从下标为0到i的元素中选取元素的和等于j,dp[i][j]为true,否则dp[i][j]为否。有以下两种边界情况:当j=0时,不选取任何数,对所有0<=i<n都有dp[i][0]=true;当i=0时,只有一个数可以选取,dp[0][nums[0]]=true。对于i>0与j>0的情况,如果j>=nums[i],则当前的元素可以选取也可以不选取;如果j<nums[i]则当前元素不能选取。状态转移方程如下:
最终得到dp[n−1][target]即为答案。
优化空间复杂度:每一行dp的值都只和上一行dp的值有关,所以可以使用一个一维数组dp[j]=dp[j] | dp[j-nums[i]]来表示每一行的值。为了保证计算的时候当前行的值等于上一行的计算结果,当前行需要从大到小更新
class Solution { public boolean canPartition(int[] nums) { if(nums.length<2){ return false; } int maxS = 0, sum = 0; for(int num : nums){ sum += num; maxS = Math.max(maxS, num); } if(sum % 2 != 0){ return false; } int target = sum / 2; //如果数组中的最大元素大于数组和的一半,则数组不能分割成两个元素和相等的子集 if(maxS>target){ return false; } boolean dp[] = new boolean[target+1]; dp[0] = true; for(int i=0; i<nums.length; i++){ int num = nums[i]; for(int j=target; j>=num; j--){ dp[j] = dp[j] | dp[j-num]; } } return dp[target]; }}