96SEO 2026-02-19 21:29 12
framework是spring生态圈中最基础的项目#xff0c;是其他项目的基础。

framework是spring生态圈中最基础的项目是其他项目的基础。
IoC控制反转使用对象时在程序方法中不要主动使用new创建对象而是由外部提供对象对象的控制权由程序转移到外部这种思想叫做控制反转。
这种思想的作用就是为了解耦。
spring对IoC思想做了实现。
spring提供了一个容器称为IoC容器用来充当IoC思想中的外部。
IoC容器负责对象的创建、初始化等一系列化工作被创建和被管理的对象在IoC容器中被统称为bean。
有时候bean与bean之间有互相依赖的关系比如service层的bean。
肯定是要跟dao层的bean联系到一起的service层的bean要创建一个dao层的bean这时候IoC容器会自动产生依赖。
这个过程叫做DI依赖注入。
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version/dependency/dependencies
导入依赖完毕后idea已经识别到了坐标的导入idea会在new
file那里显示可以创建spring的配置文件。
在resource之中创建一个就行了。
把文件名取为applicationContext。
接着在applicateionContext里边配置bean。
接下来就可以创建IoC容器直接使用IoC容器来获取bean了项目的准备工作已经创建了一个BookDao接口以及它的实现类。
IoC容器创建bean实际上也是通过调用实现类的无参构造方法下面会讲到。
由于BookService之中存在BookDao在创建BookService的bean的时候需要创建BookDao的bean所以需要在配置文件中的BookService之中使用属性表明BookService依赖于BookDao。
bean标签中除了id和class以外还可以再配置一个属性scope。
默认是singleton单例化可以置为prototype实现非单例化。
所谓单例和非单例意思就是IoC容器是否会重复创建bean对象。
假设有一个service层的接口EmpService如果是单例IoC容器只会在第一次用的时候创建出这个对象之后一直保存这个对象其实无影响因为接口中的方法执行完毕后不会改变对象的字段下一次用就从容器中取出该对象即可如果是非单例对象每一次用IoC容器都会创建一个新的EmpService对象。
适合交给IoC管理的bean单例对象controller层、service层、dao层、工具对象
不适合交给IoC管理的bean非单例对象entity/pojo中的实体
bean标签里id写给这个bean起的名字class写bean所在的位置。
当使用IoC获取bean对象时IoC会直接使用无参构造方法构造一个对象。
构造器实例化对象全部都是通过空参构造器进行构造的。
一旦不存在无参构造方法spring将抛出异常。
配置文件中写bean会让spring自动使用无参构造方法对bean进行实例化。
创建一个工厂类在工厂类的方法中new出一个接口。
主要作用是工厂类的方法中可以写逻辑。
相应地配置文件中将bean修改需要写上对应两个属性表明要通过工厂中的哪个方法来创建bean。
把静态方法改成实例方法同时必须要为工厂也创建一个bean交给IoC容器管理这样IoC容器才能通过实例工厂创建出接口的bean。
写一个工厂bean这个bean一定要实现一个接口FactoryBean。
然后重写方法返回bean对象和bean的接口class。
配置文件中只需配置一个bean指向FactoryBean之后IoC容器就会到工厂中调用继承自FactoryBean的方法创建出相应的接口对象。
问题来了通过工厂bean来创建接口bean接口bean默认就是单例的工厂bean可以在bean中通过属性来控制单例/非单例如果要让接口bean非单例应该怎么做呢只需要再实现一个方法即可。
主要有两个方法一个用在bean被初始化时一个用在bean被销毁时。
直接在bean里面写init和destroy方法就可以了。
然后要在配置文件对应的bean标签里写属性init-method把初始化的方法名填进去destroy-method把销毁的方法名填进去。
不过销毁的方法由于程序往往会极其快速关闭IoC还没关呢程序就结束了。
所以要使用IoC容器调用一个close()方法或者registerShutdownHook()。
这样就会先把IoC容器关闭将bean销毁再结束程序。
另外也可以通过实现接口重写方法的方式来控制bean的生命周期。
在单例模式下IoC容器被创建的时候所有bean都会被创建出一个对象存储在IoC容器之中。
非单例模式下IoC容器被创建的时候bean不会被实例化对象。
只有主动调用IoC容器创建beanbean才会被创建。
所以单例模式下IoC容器创建完所有bean的生命周期也就开始了。
单例初始化IoC容器执行bean的构造方法创建bean执行属性注入执行bean的钩子方法。
非单例请求IoC容器创建bean执行bean的构造方法执行属性注入执行bean的钩子方法。
使用bean执行业务操作销毁IoC容器所有bean执行钩子方法。
bean调用bean或者bean使用数值字符串需要使用依赖注入的方法来做。
主要有四种方法setter注入、构造器注入、自动装配强大的方式、集合注入
bean1的成员是bean2。
bean1不能直接new出bean2因为耦合度太高了。
可以这样做只把属性摆上去使用setter来给属性传递引用这样bean2的对象就有了。
使用setter注入需要具备数值属性或者bean属性bean属性要写一个setter方法。
然后在配置文件中配置就可以了。
如此一来当bean1创建的时候会创建一个bean2然后spring调用setter方法将bean2的引用传递给bean1的属性。
xml文件要配置使用setter注入。
在properties标签中name属性是要被注入的成员的变量名要给哪一个成员注入?ref或者value是要注入的内容要注入什么?
bean1创建的时候会调用bean1的构造方法然后bean1的构造方法需要传入一个bean2。
这时候spring会首先创建一个bean2然后再创建bean1这就是构造器注入。
xml文件要配置使用构造器注入。
构造器注入非常严谨第三方框架大量使用。
如果受控bean没有setter方法就必须使用构造器注入。
IoC自动根据类型、或名字等去容器中寻找与当前要引入的依赖成员。
直接在bean标签里再加一个属性autowise即可。
IoC识别到这个bean有依赖的时候会自动在容器中寻找然后装配。
这可以说是非常方便了。
然而也容易出现问题如果要自动装配的bean不存在必定报错如果一个接口有两个实现类就不能按照类型去自动装配了而应该按照名称。
自动装配只能应用于引用类型不能对简单类型进行注入操作。
自动装配的优先级低于setter注入和构造器注入如果同时出现自动装配失效。
如果要注入的bean是集合/数组应该如何注入呢集合/数组中存放什么数据
在bean的标签体中写上属性标签然后再在其中写入array/list/set/map/properties等标签中的一个然后再在这些标签中使用value简单类型、ref引用类型写入值。
开启context命名空间在xml文件中写入一个标签context。
!--使用命名空间加载properties文件。
system-properties-modeNEVER是说让里面的键不要被识别成系统变量--
locationclasspath*:*.properties
system-properties-modeNEVER/在xml文件中的其他位置使用${}占位符将properties的属性使用于配置文件中。
IoC容器最早是由BeanFactory实现的之后随着版本的迭代功能的追加才逐渐到ApplicationContext这一级。
在要定义成bean的controller、service、dao层的类中使用Component可以直接将这个类定义成bean。
这时候不需要在配置文件中使用bean标签。
但是配置文件中需要定义一个命名空间就是上边的加载properties文件那个命名空间。
然后使用命名空间扫描对应包的所有类文件通过反射哪些类添加了Component注解会将该类自动变成bean。
base-packageperson.ghl/为了便于区分spring让Component衍生出三种注解分别对应表现层、业务层、数据层Controller、Service、Repository。
这三种注解的作用跟Component的作用完全一样只是名字不一样用于区分罢了。
Controller、Service、Repository这三个注解后面加个括号写上id。
也可以不加括号不写id但是这样的话容器获取bean就必须使用类名的方式获取bean。
而不能使用id的方法获取bean。
spring的思想就是简化开发。
使用注解确实大大简化了开发但是还有一个东西存在——xml配置文件。
新建一个包叫做config包里面新建一个SpringConfig类这个类使用注解Configuration于是这个类就是一个配置文件了。
**再次使用注解ComponentScan(“bean所在包”)扫描bean。
**如果想要加载多个包在注解参数里使用数组{“包名”“包名”“包名”}来进行加载。
与此同时获取IoC容器就不能通过加载xml配置文件创建IoC容器对象来获取了。
而是通过读取IoC配置类来创建对象
在bean的类上Scope控制创建对象时创建单例对象还是非单例对象。
”prototype“和”singleton“
bean的生命周期在bean的方法上加上注解PostConstruct/PreDestory。
注意是在方法上
在SpringConfig类上加上注解PropertySource(”外部文件名称“)来引入外部文件。
有多个配置文件的时候使用数组。
注解方式实现引用类型依赖注入是使用自动装配的方式进行的。
只需要在成员上添加注解Autowired即可。
IoC容器首选的装配方式是根据类型接口的实现类的类型进行装配。
然而接口如果有多个的话肯定就报错了因为IoC不知道要给接口装配哪一个实现类。
如果bean的接口成员有多个实现类的话可以在Autowired下边在加上一个Qualifier(”实现类bean的id“)来确定具体装配的实现类。
只需要在bean的成员上添加valuie”值“注解就可以了。
但是这样有点儿多余直接让成员等于不就好了。
所以要换一种写法一般是使用外部文件给value注入值。
所以最后就是这样写value(”${}“)。
所以只能写一个方法在方法中new出要获取的第三方的对象给这个对象设置好属性然后将对象返回。
最后在这个方法上添加一个注解Bean表示当前方法的返回值是一个bean可以在IoC容器中找到的。
这个方法要写在一个新的类XXConfig里面不能直接写在SpringConfig里面不然耦合度太高了。
但是如果写在新的类里边就不能识别到了。
所以在SpringConfig类名上边还要再加一个注解import({XX.class})。
基本类型第三方bean的Config类中字段写所有想要注入的成员并使用注解value(”${}“)。
之后在方法里使用这些字段为第三方bean对象set值。
引用类型注入这个比较特殊不需要使用任何注解直接在方法参数中写想要注入的bean即可。
IoC会使用自动装配为形参传递引用。
最后将自定义的Config类在SpringConfig类中引入使用Import注解引入。
只需要将实现类注解成bean就可以了接口不用注解成bean。
使用的时候只使用接口。
因为spring会根据接口自动获取实现类注入接口。
mybatis的核心对象是SqlSessionFactory。
这个对象应该成为一个bean被spring管理。
这个对象是由mybatis配置文件数据源信息和mapper所在包信息得来的。
这个配置文件里边大部分信息其实都可以交给框架进行管理除了数据源和mapper所在包需要手动配置。
mybatis为了和spring整合专门写了一个包用于spring整合mybatis。
这个包里最核心的就是SqlSessionFactoryBean类。
只需要new出一个SqlSessionFactoryBean对象然后再用setter设置其数据库连接池的属性需要导入druid包将druid数据库连接池也配置成bean就没有必要再写mybatis配置文件了。
除了基本的spring-context包以及mybatis包以及mysql驱动包以外需要导入三个包spring操作数据库的包、mybatis用于整合入spring的包、druid数据源的包。
其实很简单新建一个MybatisConfig类写两个方法让IoC托管mybatis的两个核心配置bean一个bean负责数据库连接一个bean用于代理开发包扫描这样mybatis的核心配置就搞定了。
不用写核心配置文件了。
dao层写接口并实现数据访问逻辑注解开发或者代理开发。
让这个接口成为bean让IoC容器接管之后如果需要用到这个接口的实现类进行注入IoC容器会寻找mybatis的两个配置bean然后反射给这个接口提供实现类完成注入。
应当注意如果没有整合mybatis该接口在其他地方是无法完成自动装配的因为我们没有写该接口的实现类实现类是mybatis通过动态代理技术创建的。
service层写dao层对应的service接口并且写接口的实现类。
让这个实现类成为bean让IoC容器接管。
这个实现类中有dao层的接口对象使用自动装配完成注入。
然后写业务逻辑就可以了。
关键就在于将mybatis的核心配置文件变成两个bean并让IoC容器接管。
然后就跟我之前学的mybatis操作没有什么区别了。
甚至dao层的接口都不用写成beanmybatis整合入spring那么它创建的代理对象必定也是已经注册成bean的了自动装配的时候spring通过接口在IoC容器中寻找实现类是可以找到的。
AOP即面向切面编程。
它的作用是在不惊动原始设计的基础上为程序进行功能加强。
连接点将所有的方法都视为“连接点”切入点想要追加功能的连接点方法称为切入点通知追加的功能通知类通知写在通知类里边切面描述通知与切入点之间的关系
导入坐标由于spring-aop的坐标在导入spring-context的时候就已经导入了所以不需要导入。
只需要导入aspectjweaver的坐标就可以了。
然后切面中定义切入点和通知的关系。
切面中**写一个私有的void无参数方法用于绑定切入点方法并且上边添加一个注解Pointcut(execution(void
切入方法所在位置))。
**然后写一个通知方法这个通知方法就是用来写逻辑的通知方法要和切入点绑定在一起所以通知方法上边也要添加一个注解Before(“私有返回void无参数方法名()”)。
最后切面上边要写注解Component和Aspect让IoC能够识别为bean且能识别为切面。
且在SpringConfig类名上边要加一个注解EnableAspectJAutoProxy让IoC开启识别切面的模式。
配置完毕切入点方法会实现通知的功能但是不会影响原本切入点方法的设计。
bean匹配成功创建bean原始对象的代理对象调用通知方法和原始对象的方法实现功能
切入点绑定方法上的注解PointCut()的参数是一个切入点表达式。
//其实这个东西就是用来精准匹配的嘛可以使用通配符描述切入点表达式切入点表达式中的每一个东西都可以替代
*单个独立的任意符号可以独立出现也可以作为前缀或者后缀匹配符出现..多个连续的任意符号可以独立出现常用于简化包名和参数的书写专用于匹配子类类型
*..*Service.*(..))修饰符任意返回值任意包名任意类名以Service结尾必须是其子类方法任意参数任意。
一般来说空方法绑定的切入点方法是接口里的方法当然实现类中的也可以但是绑定了接口方法那所有的实现类也可以使用了。
Before在切入点方法之前嵌入通知通知方法可以传入一个JoinPoint对象用于获得切入点方法的信息
After在切入点方法之后嵌入通知通知方法可以传入一个JoinPoint对象用于获得切入点方法的信息
Around的使用和before以及after有一些不同。
使用around会默认把切入点方法覆盖。
如果不想覆盖需要给通知方法传入ProceedingJoinPoint对象继续连接点然后在Around型通知方法中调用ProceedingJoinPoint对象的proceed方法继续连接点方法的操作。
值得注意的是如果这样调用了原始连接点方法的操作而且原始连接点方法有返回值必须让通知方法有一个Object的返回值然后proceedJoinPoint.proceed()返回的值再返回就可以了不用强转就直接返回一个object就可以之后再在业务中进行强转。
而且由于无法预知连接点方法是否会抛异常所以通知方法也要抛异常。
一般来说最好用的就是Around因为它可以实现After和Before的效果。
proceedJoinPoint就是切入点方法所以它可以获取连接点的信息。
先用getSigature获取执行的签名信息再用sigature.getDeclaringTypeName()获取包类名用sigature.getName()获取方法名。
可以使用proceedJoinPoint.getArgs获取连接点方法的参数获取到之后可以修改真正的暗箱操作。
事务要么同时成功要么同时失败不会出现成功了一半这种现象。
成功了就提交中间出现异常了就回滚到原始状态。
spring事务能够保证数据层或者业务层中一系列的数据库操作同时成功或者同时失败。
事务管理注解不仅可以写在接口方法上也可以写在接口/类上表示当前接口/类的所有方法都开启事务。
写在接口上是为了降低耦合。
在jdbc配置类中除了配置druid数据库连接池为bean外还要再配一个第三方bean。
这个第三方bean要注入dataSource需要写在参数上。
打个比方银行转账业务。
转账业务是在service中的转账业务需要调用dao层中两个方法入账和出账。
而事务传播行为就是设置事务管理员以及事务协调员之间关系的。
当传播属性是REQUIRED时事务协调员的事务会加入事务管理员的事务。
当传播属性时REQUIRE_NEW时事务协调员不会加入事务管理员的事务。
具体见下表。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback