Spring框架之注解编程

2023-11-11

代码和配置

代码结构
在这里插入图片描述

maven依赖

<properties>
    <java.version>1.8</java.version>
    <spring.verson>5.3.9</spring.verson>
    <junit.version>5.7.2</junit.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.verson}</version>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

User.java 代码

package org.spring.ss.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;
import java.util.Properties;

@Data
@NoArgsConstructor
public class User {
    private String name;
    private Integer age;
    private String[] favorites;
    private Map<String, Object> map;
    private Properties props;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

UserDao.java代码

package org.spring.ss.dao;

import org.spring.ss.pojo.User;
import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    public User find() {
        return new User("赵小八", 30);
    }
}

UserService.java 代码

package org.spring.ss.service;

import org.spring.ss.dao.UserDao;
import org.spring.ss.pojo.User;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserService {
    @Resource
    public UserDao userDao;

    public User find() {
        return userDao.find();
    }
}

UserController.java代码

package org.spring.ss.controller;

import org.spring.ss.pojo.User;
import org.spring.ss.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    public UserService userService;

    public void find() {
        User userBean = userService.find();
        System.out.println(userBean);
    }
}

UserTest.java 代码:

package org.spring.ss.pojo;

import org.junit.jupiter.api.Test;
import org.spring.ss.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {
}

基于XML方式的实现

新建Spring的配置文件applicationContext.xml,并添加包扫描路径。

如果xmlns:context不存在,注意添加

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
    <!-- 添加扫描的路径 指定从哪些 package下加载被 @Component @Controller @Service @Repository 等标注的类型-->
    <!-- 指定一个大的范围 -->
    <!--    <context:component-scan base-package="org.spring.ss"/>-->
    <!-- 通过逗号分割一起指定 -->
    <!--    <context:component-scan base-package="org.spring.ss.controller,org.spring.ss.service,org.spring.ss.dao"/>-->
    <!-- 分开指定 -->
    <context:component-scan base-package="org.spring.ss.controller"/>
    <context:component-scan base-package="org.spring.ss.service"/>
    <context:component-scan base-package="org.spring.ss.dao"/>
    <!--
        base-package 的包路径还可以使用通配符配置:
        * 标示一层包的通配,com.*.dao可以包括范围如:com.aa.dao,com.bb.dao,com.cc.dao
        ** 标示不确定层包通配,com.**.dao可以表示的范围如:com.aa.dao,com.aa.aa1.dao,com.bb.dao,com.bb.bb1.dao
    -->
</beans>

UserTest.java里添加测试代码:

@Test
public void testBySpringXML() {
    // ioc 容器初始化
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    // ioc 通过bean 的 id 获取指定的bean
    UserController userController = applicationContext.getBean("userController", UserController.class);
    // 使用bean
    userController.find();
}

输出User(name=赵小八, age=30, favorites=null, map=null, props=null)

限制指定包可以使用的注解

修改applicationContext.xml配置文件:

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
    <!-- 添加扫描的路径 指定从哪些 package下加载被 @Component @Controller @Service @Repository 等标注的类型-->
    <!-- 指定一个大的范围 -->
    <!--    <context:component-scan base-package="org.spring.ss"/>-->
    <!-- 通过逗号分割一起指定 -->
    <!--    <context:component-scan base-package="org.spring.ss.controller,org.spring.ss.service,org.spring.ss.dao"/>-->
    <!-- 分开指定 -->
    <!--<context:component-scan base-package="org.spring.ss.controller"/>
    <context:component-scan base-package="org.spring.ss.service"/>
    <context:component-scan base-package="org.spring.ss.dao"/>-->

    <!--
        还可以使用通配符
        * 标示一层包的通配,com.*.dao可以包括范围如:com.aa.dao,com.bb.dao,com.cc.dao
        ** 标示不确定层包通配,com.**.dao可以表示的范围如:com.aa.dao,com.aa.aa1.dao,com.bb.dao,com.bb.bb1.dao
    -->

    <!--
    use-default-filters="false" 表示不适用默认的过滤器
        默认过滤器会识别 @Component @Controller @Service @Repository
    -->
    <context:component-scan base-package="org.spring.ss.controller" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <context:component-scan base-package="org.spring.ss.service,org.spring.ss.dao">
        <!-- 排除掉某个注解 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
</beans>

这个时候尝试修改UserController上面的注解为@Component

package org.spring.ss.controller;

import org.spring.ss.pojo.User;
import org.spring.ss.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

@Component
public class UserController {
    @Autowired
    public UserService userService;

    public void find() {
        User userBean = userService.find();
        System.out.println(userBean);
    }
}

重新运行测试用例testBySpringXML,可以看到下面的错误提示。
在这里插入图片描述

基于java类配置实现

添加SpringConfig.java文件,代码如下,以下代码实现了和上面xml代码配置一样的功能

package org.spring.ss;

import org.spring.ss.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;

/*
 * java配置类,相当于 applicationContext.xml
 * */
@Configuration
@ComponentScans({ // 配置扫描路径
        @ComponentScan("org.spring.ss.controller"),
        @ComponentScan("org.spring.ss.service"),
        @ComponentScan("org.spring.ss.dao"),
})
public class SpringConfig {
    /**
     * @return
     * @Bean 作用和我们在applicationContext.xml中添加的<bean> 效果一样</>
     * 默认的name是方法名称
     * 自定义的name 可以通过value属性或者name属性来指定
     */
    @Bean(name = {"aaa", "bbb"})
    public User getUser() {
        User user = new User();
        user.setName("王小六");
        return user;
    }
}

添加测试代码:

@Test
public void testBySpringConfig() {
    // ioc 容器初始化
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    // ioc 获取配置类中设置的 bean
    User userBean = (User) applicationContext.getBean("aaa");
    // 使用bean
    System.out.println(userBean);
    // 获取容器中被扫描标记的
    UserController userController = applicationContext.getBean("userController", UserController.class);
    // 使用bean
    userController.find();
}

输出

User(name=王小六, age=null, favorites=null, map=null, props=null)
User(name=赵小八, age=30, favorites=null, map=null, props=null)

限制指定包可以使用的注解

修改spring配置类SpringConfig.java

package org.spring.ss;

import org.spring.ss.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;

/*
 * java配置类,相当于 applicationContext.xml
 * */
@Configuration
/*
*  @ComponentScan 如果不去指定扫描的路基,默认是会扫描当前目录及其子目录下的所有的
 *                被@Componenet @Controller @Service @Repository标注的类型
* */
@ComponentScans({
        @ComponentScan(
                value = "org.spring.ss.controller",
                useDefaultFilters = false,
                includeFilters = {@ComponentScan.Filter(Controller.class)}),
        @ComponentScan(
                value = {"org.spring.ss.service","org.spring.ss.dao"},
                excludeFilters = {@ComponentScan.Filter(Controller.class)}),
})
public class SpringConfig {
    /**
     * @return
     * @Bean 作用和我们在applicationContext.xml中添加的<bean> 效果一样</>
     * 默认的name是方法名称
     * 自定义的name 可以通过value属性或者name属性来指定
     */
    @Bean(name = {"aaa", "bbb"})
    public User getUser() {
        User user = new User();
        user.setName("王小六");
        return user;
    }
}

这个时候尝试修改UserController上面的注解为@Component

package org.spring.ss.controller;

import org.spring.ss.pojo.User;
import org.spring.ss.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

@Component
public class UserController {
    @Autowired
    public UserService userService;

    public void find() {
        User userBean = userService.find();
        System.out.println(userBean);
    }
}

重新运行测试用例testBySpringConfig,可以看到下面的错误提示。
在这里插入图片描述

@Autowired@Resource的区别

@Autowired:默认只能根据类型来查找,可以结合@Qualifier("abc")注解来实现通过name查找

@Resource:默认是根据类型来查找,但是提供的有typename属性类实现不同的查找方式,@Resource(name="abc") 或者@Resource(type=UserService.class)

@Value注解的使用

修改SpringConfig.java添加对org.spring.ss.pojo包的扫描。

package org.spring.ss;

import org.spring.ss.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;

/*
 * java配置类,相当于 applicationContext.xml
 * */
@Configuration
/*
*  @ComponentScan 如果不去指定扫描的路基,默认是会扫描当前目录及其子目录下的所有的
 *                被@Componenet @Controller @Service @Repository标注的类型
* */
@ComponentScans({
        @ComponentScan("org.spring.ss.pojo"),
        @ComponentScan(
                value = {"org.spring.ss.controller"},
                useDefaultFilters = false,
                includeFilters = {@ComponentScan.Filter(Controller.class)}),
        @ComponentScan(
                value = {"org.spring.ss.service","org.spring.ss.dao"},
                excludeFilters = {@ComponentScan.Filter(Controller.class)}),
})
public class SpringConfig {
    /**
     * @return
     * @Bean 作用和我们在applicationContext.xml中添加的<bean> 效果一样</>
     * 默认的name是方法名称
     * 自定义的name 可以通过value属性或者name属性来指定
     * @Primary 表示如果遇到同类型的bean, 优先返回
     */
    @Bean(name = {"aaa", "bbb"})
    @Primary
    public User getUser() {
        User user = new User();
        user.setName("王小六");
        return user;
    }
}

添加Account.java

package org.spring.ss.pojo;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

@Data
@Component
public class Account {
    @Value("bobo") // 注入普通的字符串
    private String userName;

    @Value("#{systemProperties['os.name']}")
    private String systemPropertiesName; // 注入操作系统的信息

    @Value("#{T(java.lang.Math).random()*100}")
    private double randomNumber; // 注入表达式的结果

    // 注入其他Bean的属性, aaa 来自于 SpringConfig,是通过 java 配置类注入的
    @Value("#{aaa.name}")
    private String fromPersonName;

    @Value("classpath:test.txt")
    private Resource resourceFile;

    @Value("http://www.baidu.com")
    private Resource baiduFile;
}

添加测试方法

@Test
public void testBySpringConfig2() {
    // ioc 容器初始化
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    // ioc 通过bean 的 id 获取指定的bean
    Account account = applicationContext.getBean("account", Account.class);
    // 使用bean
    System.out.println(account);
}

输出Account(userName=bobo, systemPropertiesName=Windows 10, randomNumber=16.667755826649376, fromPersonName=王小六, resourceFile=class path resource [test.txt], baiduFile=URL [http://www.baidu.com])

@PropertySouce引入属性文件

添加属性文件
在这里插入图片描述
Java配置类中通过@PropertySouce注解来显示的引入属性文件
在这里插入图片描述
效果
在这里插入图片描述

@Lazy注解

@Lazy 注解可以提高系统加载速度,@Component 和 @Lazy 一起使用的时候,被修饰的类在启动的时候不会被初始化,只有通过 ApplicationContext 对象的 getBean 方法获取的时候,或者第一次被使用的时候才会初始化。

需要注意的是 bean 的作用域范围为 prototype 的时候,也不会在加载的时候初始化。

作用范围

  • 可以作用于在类上和 @Component 注解搭配使用
  • 也可以作用在方法上和 @Bean 注解搭配使用
  • 当作用在类上和 @Configuration 注解搭配使用的情况下,该类下面所有带有 @Bean 注解的对象都将受到同样的影响

属性功能

  • value 的默认值为 true
  • 如果为 true 并且在其他 Bean 没有对其依赖或者没有使用的情况下将不会初始化
  • 如果为 false,跟其他的 Bean 一样正常加载

生命周期注解@PostConstruct @PreDestory

Spring负责管理Bean的初始化和销毁,但同时也提供方式让我们在bean初始化之后、销毁之前执行特定业务。@PostConstruct 和 @PreDestroy 注解,主要实现Bean在初始化之后、销毁之前执行自定义业务。

实现Bean在初始化之后,销毁之前执行自定义业务,还有其他两种方式。

  1. Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
  2. Spring 的 init-method 和 destory-method

Spring会在初始化bean属性之后,调用一次拥有@PostConstruct注解的方法。该方法可以为任何访问级别,但不能为static。

@Component
public class DbInit {
 
    @Autowired
    private UserRepository userRepository;
    // 该示例首先初始化userRepository,然后调用postConstruct()方法。
    @PostConstruct
    private void postConstruct() {
        User admin = new User("admin", "admin password");
        User normalUser = new User("user", "user password");
        userRepository.save(admin, normalUser);
    }
}
@Component
public class UserRepository {
 
    private DbConnection dbConnection;
    // 该方法一般用于在bean销毁之前释放资源或执行其他清理任务,如关闭数据库连接。
    @PreDestroy
    public void preDestroy() {
        dbConnection.close();
    }
}

需要注意的是 @PostConstruct@PreDestroy 注解是Java EE的一部分。自Java 9开始 Java EE 已被标注不建议使用,在Java 11 中已经被移除,因此需要手动增加相应依赖:

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

@DependsOn注解

@DependsOn指定实例化对象的先后顺序

@Component
@DependsOn({"user"}) // Person的实例化依赖于User对象的实例化,也就是User先于Person实例化
public class Person {

    public Person(){
        System.out.println("Person 构造方法执行了...");
    }
}

@Import注解

添加Cat.java

package org.spring.ss.pojo;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

@Data
public class Cat {
    @Value("加菲猫")
    private String color;
    private String nick;
}

静态使用

@Import注解中将前面创建的Cat.java引入到IOC容器,这种方式的缺点是:无法灵活的指定引入的类型。
在这里插入图片描述

测试代码:

@Test
public void testBySpringConfig3() {
    // ioc 容器初始化
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    // ioc 通过bean 的 id 获取指定的bean
    Cat cat = applicationContext.getBean(Cat.class);
    // 使用bean
    System.out.println(cat);
}

结果:Cat(color=加菲猫, nick=null)

动态使用

动态可以通过一定的逻辑来指定加入 IOC 容器中的对象。
LoggerService.java

package org.spring.ss.service;

public class LoggerService {
}

CacheService .java

package org.spring.ss.service;

public class CacheService {
}

ImportSelector

通过实现接口 ImportSelector 的 selectImports 方法,来灵活控制引入的类型。

package org.spring.ss;

import org.spring.ss.service.CacheService;
import org.spring.ss.service.LoggerService;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class ImportSelectorImpl implements ImportSelector {
    /**
     *
     * @param annotationMetadata
     * @return
     *    IoC 要加载的类型的全路径的字符串数组
     */
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        // 在此处实现不同的业务逻辑控制
        return new String[]{LoggerService.class.getName(), CacheService.class.getName()};
    }
}

修改SpringConfig.java
在这里插入图片描述
测试代码

@Test
public void testBySpringConfigImport() {
    // ioc 容器初始化
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    // 获取 IOC 容器中所有 bean 的名字
    String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        System.out.println(beanDefinitionName);
    }
}

在这里插入图片描述

ImportBeanDefinitionRegistrar

通过重写 ImportBeanDefinitionRegistrarregisterBeanDefinitions 方法,来灵活控制引入的类型。

package org.spring.ss;

import org.spring.ss.service.CacheService;
import org.spring.ss.service.LoggerService;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class ImportBeanDefinitionRegistrarImpl implements ImportBeanDefinitionRegistrar {

    /**
     *
     * @param annotationMetadata
     * @param beanDefinitionRegistry IoC容器中管理对象的一个注册器
     */
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        // 需要将添加的对象包装为一个RootBeanDefinition对象
        RootBeanDefinition cache = new RootBeanDefinition(CacheService.class);
        beanDefinitionRegistry.registerBeanDefinition("cache",cache);

        RootBeanDefinition logger = new RootBeanDefinition(LoggerService.class);
        beanDefinitionRegistry.registerBeanDefinition("logger",logger);
    }
}

修改SpringConfig.java
在这里插入图片描述
执行测试用例
在这里插入图片描述

SpringBoot中的ConditionalXXX

@Conditional扩展注解 作用(判断是否满足当前指定条件)
@ConditionalOnJava 系统的Java版本是否符合要全
@ConditionalOnBean 容器中存在指定的Bean
@ConditionalOnMissingBean 容器中不存在指定的Bean
@ConditionalOnExpression 满足SpEL表达式
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定的资源文件
@ConditionalOnWebApplication 当前是Web环境
@ConditionalOnNotWebApplication 当前不是Web环境
@ConditionalOnJndi JNDI存在指定项

具体案例

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class ConditionalOnClass implements Condition {
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        try {
            Class<?> aClass = conditionContext.getClassLoader().loadClass("com.gupaoedu.test.Test1");
            return aClass==null?false:true;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return false;
    }
}
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;


public class ConditionalOnBean implements Condition {
    /**
     *  如果IoC容器中有Person对象就返回true 否在返回false
     *
     * @param conditionContext
     * @param annotatedTypeMetadata
     * @return
     *    true 表示IoC容器加载该类型
     *    false 表示IoC容器不加载该类型
     */
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        boolean flag = conditionContext.getRegistry().containsBeanDefinition("person");
        System.out.println(flag + " **** ");
        return flag;
    }
}

多环境下的解决方案之Profile

Profile本质就是Conditional的实现。
添加DataSource类:

package org.spring.ss.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class DataSource {
    private String username;

    private String password;

    private String url;
}

SpringConfig.java中添加环境配置。

@Bean
@Profile("pro") // 其实Profile注解本质上就是Conditional的一种实现
public DataSource proDataSource() {
    DataSource ds = new DataSource("root", "123", "192.168.11.190");
    return ds;
}

@Bean
@Profile("dev")
public DataSource devDataSource() {
    DataSource ds = new DataSource("admin", "456", "192.168.12.190");
    return ds;
}

添加测试代码:

public void testByProfile() {
   AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();

    ac.getEnvironment().setActiveProfiles("pro");
    ac.register(SpringConfig.class);
    ac.refresh();
    System.out.println(ac.getBean(DataSource.class));
}

输出DataSource(username=root, password=123, url=192.168.11.190)

Bean对象的作用域

作用域 说明
prototype 每次请求,都是一个新的Bean( java原型模式
singleton bean是单例的(Java单例模式
request 在一次请求中,bean的声明周期和request同步
session bean的生命周期和session同步

默认的情况是 singleton

@Bean
@Scope("prototype")
public Person person(){
    return new Person();
}
@Bean
@Scope("singleton")
public Person person(){
    return new Person();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring框架之注解编程 的相关文章

  • 如何注入“运行时”依赖项,例如登录用户,该依赖项在应用程序启动时不可用?

    我只是不明白这个 我在我的 java GWT 应用程序中使用 Gin 来进行 DI 登录屏幕集成到完整的应用程序窗口中 用户登录后 我想将用户对象注入到我创建的其他类 例如 GUI Presenters 中 因此我相信存在某种运行时依赖性
  • 检查两个日期周期是否重叠[重复]

    这个问题在这里已经有答案了 我有两个日期范围 start1 end1 gt gt date1 start2 end2 gt gt date2 我想检查两个日期是否重叠 我的流程图我假设 运算符对于比较是有效的 boolean isOverL
  • Google API - 重定向 URI 不匹配错误

    我正在我的网络应用程序上实现 google 登录 我通过参考this尝试过link https developers google com web signin server side flow 我的 google 登录按钮如下 div s
  • 带有 Spring RequestMapping 路径参数的编码斜杠 (%2F) 给出 HTTP 400

    这不是重复的参考问题 https stackoverflow com questions 3235219 因为它是 Spring 特有的 无论谁添加了这个 事实发生三年后 都没有费心去阅读问题或评论线程来看看真正的答案是什么 接受的答案并不
  • Spring MVC 和 Struts MVC 之间的区别 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Spring MVC 和 Struts MVC 之间的主要区别是什么 Spring MVC 和 Struts 之间的主要区别是 Spr
  • 将 Swing 集成到简单的文本冒险游戏中

    我对 Java 中的一些中级概念相当陌生 最近 我制作了一款名为 DazzleQuest 的文本冒险游戏 它完全在开发者控制台 终端中运行 它涉及到我的朋友作为角色 所以我想向他们展示它 并通过将命令行的功能和控制台的输出转移到一个简单的
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • Cognito SRP 身份验证 JAVA SDK

    我正在尝试使用 Cognito 验证 Java 应用程序 我在Python中使用了warrant库 效果非常好 但我现在想在java中做同样的事情 我的 Python 函数用于身份验证warrant https github com cap
  • 如何在休眠中持久保存实体期间验证实体的约束

    我有一个带有字段名称的实体 我希望它不超过255 所以我这样定义它 Entity public class A implements Serializable NotNull Size max 255 private String name
  • JAVA 签名对象 - 没有安装的提供程序支持此密钥:sun.security.rsa.RSAPrivateCrtKeyImpl

    我想使用密钥工具和以下命令创建的一对 RSA 密钥对我创建的文件进行签名 keytool genkeypair alias key keyalg RSA keysize 2048 sigalg SHA256withRSA validity
  • 异步不适用于控制器的抽象超类方法

    我有一个BaseRestControllerRest 控制器扩展的类 它有一个我想异步运行的方法 public abstract class BaseRestController Async someThreadPoolTaskExecut
  • BODMAS系统的加法和减法

    我一直在构建一个简单的公式计算器 但一直被加法和减法困扰 正如您应该知道的 在计算方程时 您遵循优先级算术规则 即括号 顺序 幂函数 除法 乘法 加法和减法 问题是加法和减法具有相同的优先级 因此您可以从左到右阅读 到目前为止 这是我的代码
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 为什么我在 Java 中收到有关“可能丢失精度”的警告?

    class Test public static void main String args short s 2 s1 200 s2 s2 s s1 error possible loss of precision System out p
  • 何时对字符串文字使用 intern()

    我看到很多这样的遗留代码 class A public static final String CONSTANT value intern 我看不出使用 intern 的任何原因 因为在 Javadoc 中可以读到 所有文字字符串和字符串值
  • 如何在 Windows 上使用 Java Hotspot JVM 禁用小型转储 (mdmp) 文件生成

    目前 我有一个已部署的可执行 jar 文件 该文件在崩溃时会创建大型 7 Gb 小型转储文件 我想要一个导致崩溃原因的文本表示 而不是 JVM 状态的二进制文件 我尝试使用中找到的信息这个 CodeRanch 帖子 http www cod
  • 如何在 Spring boot 应用程序中使用禁用连接池?

    我在 Application java 中创建一个像这样的数据源 Bean ConfigurationProperties datasource public DataSource dataSource return DataSourceB
  • 在地图中的图块上实现鼠标单击事件

    我正在尝试在 JPanel 上实现图像 基本上是地图上的图块 的鼠标单击事件 我只是不知道该怎么做 我有一个扩展 JPanel 的 Main 类 我正在从图块服务器检索图块 并根据特定的缩放级别在 Main 类的 PaintComponen
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • Cassandra 会话与集群 有什么可分享的?

    考虑 Cassandra 的 Session 和 Cluster 类 Java 驱动程序 我想知道有什么区别 在 Hibernate 中 每次都会创建一个会话并共享会话工厂 从许多来源我了解到 它被认为是创建一个会话并在多个线程之间共享它

随机推荐

  • Redis 安装系统服务报错 HandleServiceCommands: system error caught. error c ode=1073, message = CreateS

    系统已经存在该服务 需要先卸载才能重新安装 点击查看详细操作链接
  • ARC149题解

    ARC149 没有 F 题 A A A 题意 给定 n m 找到一个数字长 n 位 每位数字都相同且是 m 的倍数 题解 直接模拟 代码 B B B 题意 给定序列 A B 每次可以同时交换
  • JDK动态代理UndeclaredThrowableException异常

    UndeclaredThrowableException异常背景 最近项目上出现了 JDK动态代理UndeclaredThrowableException异常 此异常之前没有接触过 那么该异常将会导致什么呢 UndeclaredThrowa
  • 深圳讯商丨wms仓储管理系统在国内的应用方向有哪些

    wms仓储管理系统往常运用的很多 而且运用wms仓储管理系统便当 关于wms仓储管理系统在国内的应用方向有哪些呢 1 配送中心应用的wms仓储管理系统 如连锁超市的配送中心 汽车企业零配件配送中心等 这样的应用比较典型 如某医药集团物流中心
  • ffmpeg文档34-音频滤镜

    34 音频滤镜 当你配置编译FFmpeg时 先采用 disable filters可以禁止所有的滤镜 然后显式配置想要支持的滤镜 下面是当前可用的音频滤镜 adelay 延迟一个或者多个音频通道 它接受如下选项 delays 参数是以 分隔
  • Markdown基本语法

    Markdown是一种纯文本格式的标记语言 通过简单的标记语法 它可以使普通文本内容具有一定的格式 优点 1 因为是纯文本 所以只要支持Markdown的地方都能获得一样的编辑效果 可以让作者摆脱排版的困扰 专心写作 2 操作简单 比如 W
  • WebUI自动化测试之Selenium学习笔记(二)浏览器控制

    文章目录 Selenium库中webdriver模块的使用 1 浏览器控制 用例 2 鼠标控制 用例 3 键盘控制 4 获取属性信息 用例 4 窗口切换 用例 5 警告框处理 用例 6 下拉框选择操作 用例 7 文件上传 8 cookie操
  • 并行算法解决list

    并行算法序列和字符串 Scan prefix sums List ranking Sorting Merging Medians Searching String matching Other string operations 并行算法的
  • linux下如何使用 tcpdump 进行抓包详细教程

    非功能测试总览 前面的非功能测试总览种提出的 tcp网络访问dump 进行的额外补充 1 tcpdum核心参数详解 2 理解tcpdump的输出 3 常规过滤规则 4 可选参数解析 5 过滤规则组合 6 特殊过滤规则 7 如何抓取更为准确的
  • 查看linux服务主机,Linux下CodeStriker Server的搭建

    分为以下几个步骤 1 检查并安装Perl解析程序 一般情况下Lnux系统中自带perl解析程序 运行rpm qa grep perl 可以检查是否安装有 在本次安装中 检查到目标机器上装有版本号为5 8 8 10的perl解析程序 如系统中
  • maven中的scope--依赖范围

    初学springboot 在maven配置中了解的 记录下来 在一个maven项目中 如果存在编译需要而发布不需要的jar包 可以用scope标签 值设为provided
  • Aspose转换功能演示:使用C#以编程方式将STL转换为PDF或图像

    STL 立体光刻的缩写 代表3D表面几何形状 这些通常在与CAD有关的应用程序中使用 使用Aspose可以轻松快捷地将STL文件转换为PDF 由于PDF格式的兼容性 这种文件格式转换在需要查看不同操作系统和环境中的信息的情况下很有用 同样
  • 【数据结构--顺序表】移除元素(移除数组中等于val的元素,返回移除后数组新长度)

    题目描述 思路1 定义一个指针str指向首元素 遍历数组nums 如果 str val 则将该元素后面的所有元素前挪一位覆盖该元素 若 str val 则str 然而我们来看看这种写法的时间复杂度 我们可否将时间复杂度优化一下呢 由此想到第
  • PyQty5—第一课:安装及简单的界面设计(附代码)

    在日常办公中我们将经常使用的代码与PyQty5进行配合 从而设计出GUI的小程序 这样不经界面好看而且可以进行打包 发给自己的亲朋好友们进行使用 那么今天我们就来进行PyQty5的第一节课 1 首先我们需要安装PyQty5的库 库名 安装
  • TypeScript 基本类型(一)

    1 boolean 布尔值 true false let isDone boolean false 2 number 数字 和JavaScript 一样 TypeScript 里的所有数字都是浮点数 另外支持二进制 八进制 十进制 十六进制
  • C++ QT连接SQL Server基操

    以下是一个使用C QT连接SQL Server的示例代码 include
  • uniapp登录流程详解uni.login

    uni login OBJECT 登录 H5平台登陆注意事项 微信内嵌浏览器运行H5版时 可通过js sdk实现微信登陆 需要引入一个单独的js 详见普通浏览器上实现微信登陆 并非开放API 需要向微信申请 仅个别开发者有此权限H5平台的其
  • 带你认识一下“京东到家-网关系统”

    京东到家三周年活动已然结束 在这2年里 我们的网关系统经历过了618 1020 双11 双12 415等多个非常有意义的考试 回顾起来依旧让人觉得很刺激 每次考前我们和市场部都做了大量的效果预估 压测 扩容 但是活动当日依旧是惊心动魄 瞬时
  • 2021组队训练赛第11场

    我们的终极目标不是AC 而是获取经验 2021组队训练赛第11场 我们的终极目标不是AC 而是获取经验 问题 A ABB 题意 考点 问题 C Bob in Wonderland 题意 考点 问题 F Zeldain Garden 题意 考
  • Spring框架之注解编程

    代码和配置 代码结构 maven依赖