1、为什么需要springboot?
spring有两大核心能力,一个是IOC,一个是AOP
要实现IOC需要如下配置:
<?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="user" class="ioc.User"/> </beans>当有大量的bean的时候,配置及管理就是一件比较繁琐的事情,于是引入了注解配置,当然需要先在xml里面显示引入自动扫描注解的能力,如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 开启注解扫描,base-package指定扫描的包--> <context:component-scan base-package="ioc"/> </beans>
如果依赖了一些第三方包,可能没法在代码里面添加注解,这个时候又回到了xml手工配置时代
后来又引入了javaconfig的方式来实现bean的配置,即编写一个配置类,在配置类里面定义要配置的类,这种方式就特别灵活了,如下:
/** * 配置类,可以声明任何的bean */ @Configuration public class BeanConfig { @Bean public User user() { return new User(); } }
@RunWith(SpringJUnit4ClassRunner.class) // 加载beanConfig配置类 @ContextConfiguration(classes = BeanConfig.class) public class SpringIocTest { @Resource private User user; @Test public void test2() { System.out.println(user); } // 输出结果:ioc.User@34b7ac2f }
太灵活造成的问题就是管理混乱,那如何即保留这种灵活性,有能有序的管理呢?这就是springboot要解决的问题
除此外,依赖配置也面临同样的问题,总之springboot就是为了简化配置,简化开发而提出的
AOP需要如下配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="wmzService" class="com.example.demo.service.impl.WMZServiceImpl"></bean> <bean id="zsService" class="com.example.demo.service.impl.ZSServiceImpl"></bean> <!-- 切面类 --> <bean id="OrderXmlAop" class="com.example.demo.aop.OrderXmlAop"></bean> <!-- Aop配置 --> <aop:config proxy-target-class="true"> <!-- 切面 --> <aop:aspect ref="OrderXmlAop"> <!-- 前置通知: 在目标方法调用前执行 --> <aop:before pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doBefore"/> <!-- 后置通知: --> <aop:after pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfter"/> <!-- 返回后通知 --> <aop:after-returning pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfterReturning"/> <!-- 异常通知 --> <aop:after-throwing pointcut="execution(public * com.example.demo.service.TakeawayService.*(..)))" method="doAfterThrowing"/> </aop:aspect> </aop:config> </beans>
跟之前一样,后来的发展也是到了javaconfig,通过配置类来配置aop
2、springboot的核心能力?
三个核心注解:
1 @Configuration 2 @EnableAutoConfiguration 3 @ComponentScan 4 public class Application { 5 public static void main(String[] args) { 6 SpringApplication.run(Application.class, args); 7 } 8 }这是springboot应用的main入口,可以看到有三个注解,这三个注解非常核心
@configuration标注当前类是配置类
@EnableAutoConfiguration标注启动自动配置的功能,有了这个注解,可以根据pom里面配置的starter在自动分析要加载的依赖组件
@ComponentScan标注自动扫描spring组件,有了这个注解,可以识别并加载spring中声明的组件到bean容器了。否则你定义的组件就不会被spring管理,比如某个配置类就找不到,就不会配置
