• spring


    重新安装idea 和gradle 搭建一个项目,此刻项目正在下载gradle 的相关包,spring boot的书重新拿出来翻翻,温故一下,加深一下记忆,现在公司要做后台接口项目,之前一直在看前端的东西。

    看着文档看着看着,越来越感觉大家都有或多或少的想通之处,某些方面表现出来的东西也差不多,虽然风格不同,但作用或目的都有相似。

    spring 推荐使用java 配置代替xml 配置。

    bean 是spring 管理实例的单位,声明一个bean 以为着spring 会管理相关的类,理解为编译类的包装比较好理解。

    声明注解:

    @bean、@service、@repository、@controller

    注入

    @autowired、@inject、@resource、后面2个用的甚少。

    声明配置类:node 也有配置,所有的框架或者插件需要有配置,很多也都有配置类的存在,bean更类似于一个实例,但不是实例

    @Configuretion: 声明一个配置类(JAVA 配置)全局

    @Bean:声明在一个方法上,声明此方法返回的是一个bean

    通过构造函数直接注入,不使用antowired注入。

    aop:面向切面

    添加依赖

    @AspectJ 声明切面

    @After、@Before、@Around  生命周期

    在声明周期中指定切点或切面,返回一个joinPoint 参数,通过此参数获取相关信息

    @After("annotationPointCut()")
        public void after(JoinPoint joinPoint){
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            Method method = methodSignature.getMethod();
            System.out.println(method.getName());
        }
    
        @Before("execution(* com.duoke.demo.service.MethodService.*(..))")
        public void before(JoinPoint joinPoint){
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            Method method = methodSignature.getMethod();
            System.out.println(method.getName());
        }

    作用域:bean 个数

    1.Singleton :默认,单例

    2.Prototype:每次新建一个新的实例

    3.request:每次http request调用新建

    4.session:http session 新建一个实例

    5.protal项目新建实例(protal 不明)

    @Scope   类声明scope

    spring el表达式:资源调用依赖common-io

    获取配置文件中的数据

    @PropertySource(value = "classpath:application.properties")
     @Value("${author.name}")
        private String name;

    bean声明周期:创建和销毁

    init 方法和destroy 方法,在初始化时调用,且在调用构造函数之后和实际销毁之前执行。

    @Bean(initMethod="",destoryMethod="")

    Profile: 有点类似条件编译的意思

    注册环境状态(springboot 直接在总配置文件中直接可配置)

    configApplicationContext.getEnvironment().setActiveProfiles("dev");

    在spring上下文中获取的bean 会根据profile的激活状态返回不同的实例

    @Profile("dev")
        @Bean(initMethod = "init")
        public ProfileBean dev(){
            return  new ProfileBean("dev");
        }
    
        @Profile("prod")
        @Bean
        public ProfileBean pro(){
            return new ProfileBean("prod");
        }

    Bean之间的消息通信:事件监听、事件发送 applicationEvent

    监听

    @Component
    public class CustomListener implements ApplicationListener<CustomEvent> {
        @Override
        public void onApplicationEvent(CustomEvent event) {
            String msg = event.getMsg();
            System.out.println("THIS MSG FROM CUSTOMEVENT"+msg);
        }
    }

    自定义事件

    public class CustomEvent extends ApplicationEvent {
    
        /**
         * Create a new ApplicationEvent.
         *
         * @param source the object on which the event initially occurred (never {@code null})
         */
        public CustomEvent(Object source,String msg) {
            super(source);
            this.msg = msg;
        }
    
        private String msg;
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }

    触发事件

    @Component
    public class CustomPublish {
        @Autowired
    //            注入应用监听上下文
                ApplicationContext context;
    
        //    发送事件
        public void publish(String msg) {
            context.publishEvent(new CustomEvent(this,"this is from publish"));
        }
    }

    多线程:TaskExecutor(jdk 提供的Executor的子集)

    @EnableAsync 开启异步任务支持

    @Async 声明异步任务

    使用ThreadPoolTaskExecutor,通过executor 执行异步任务,比较方便,但是有时候直接使用jdk提供的情况可能会较多。

    计划任务:scheduledTaskService

    @EnableScheduling 开启计划任务

    @Scheduled : 计划任务声明

    @Configuration
    @ComponentScan(value = "com.duoke.demo.job")
    @EnableScheduling
    public class JobConfig {
    
    }

    条件注解:Condition

    @Conditional 根据满足的某一个特定条件创建一个Bean

     @Bean
        @Conditional(value = WinCondition.class)
        public CmdService isWin(){
            return new WindowOsBean();
        }
    // 判断当前环境
    public class WinCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            Boolean isWin = context.getEnvironment().getProperty("os.name").contains("Windows");
            Map<String, Object> name = metadata.getAnnotationAttributes("");
    
            return isWin;
        }
    }

    组合注解、元注解(标记在注解上的)

    // /** Class, interface (including annotation type), or enum declaration */
    @Target(ElementType.TYPE)
    // 保存政策:运行时
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    @ComponentScan
    public @interface CustomAnno {
        String value() default "This is CustomAnno";
    }

    @Enable* 注解开启功能原理

    使用@Import 注解导入配置。(其中有一些是条件判断引入)

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(AsyncConfigurationSelector.class)
    public @interface EnableAsync {
    

    spring 测试支持:

    集成junit、testNg,@RunWith 指定测试框架、@ContextConfiguration 指定测试配置

    就跟一个普通的bean 一样,注入需要测试bean。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {TestConfig.class})
    @ActiveProfiles("prod")
    public class SpringTest {
        @Autowired
        private TestBean testBean;
    
        @Test
        public void test(){
            System.out.println(testBean.getContext());
        }
  • 相关阅读:
    把程序的定义与实现部分用头文件与源文件分开
    简单控件的应用(二)—学生管理系统
    Java基础14
    创建插入符、输出不同效果的文字
    Java基础12
    简单控件的应用(一)—prj计算器
    简单的Win 32 Application
    最简单的音乐播放器
    消息处理初步
    基于MFC,在非客户区与客户区利用CButon类创建button
  • 原文地址:https://www.cnblogs.com/jony-it/p/11348722.html
Copyright © 2020-2023  润新知