前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 示例项目

Spring Boot 示例项目

作者头像
WindWant
发布2020-09-11 10:42:47
6670
发布2020-09-11 10:42:47
举报
文章被收录于专栏:后端码事

Spring Boot 基于注解式开发 maven REST 示例项目

项目地址:https://github.com/windwant/spring-boot-service

项目地址:https://github.com/windwant/spring-dubbo-service

代码语言:javascript
复制
项目特色:

1. servlet、listener、interceptor、filter配置

2. mybatis配置集成,多数据源 RouingDataSource

3. 集成jmx监控 MBean

4. 定时任务配置 Scheduled

5. aop配置

6. ftp服务 FTPTranport

7. 测试 SpringBootTest

8. Metrics监控

9. 参数验证 javax.validation hibernate.validator

a) 测试:/hellox?name=

10. 跨域处理 Cors

11. 权限控制 shiro权限框架

a) 测试用户:userName: admin passwd: admin

b) 验证码:/login/checkcode

c) 登录:/login?userName=&passwd=&code=

d) 测试:/hellox?name=

12. 导出Excel SXSSFWorkBook 海量数据导出

a) 测试:/export

13. Consul服务注册与发现;

a) 服务启动注册到consul;

b) 测试获取redis服务,初始化redis资源;

c) consul 监控redis服务;

d) 注意consul客户端和consul程序版本问题

14. reids分布式锁

a) lua脚本 获取redis分布式锁

15. SPI机制:org/windwant/spring/core/spi

a) 运行时配置:META-INF/services/org.windwant.spring.core.spi.Calc

16. static资源,“/”映射

17. 使用druid数据源连接池;配置druid数据源监控:http://localhost:8081/druid/index.html

18. Dubbo RPC 服务

一、 Web servlet、listener、interceptor等

1. servlet:

代码语言:javascript
复制
启动类添加注解@ServletComponentScan
代码语言:javascript
复制
编写servlet:
代码语言:javascript
复制
@WebServlet("/web")
代码语言:javascript
复制
public class BootSevlet implements Servlet {
代码语言:javascript
复制
...
代码语言:javascript
复制
2. Interceptor:
代码语言:javascript
复制
编写:
代码语言:javascript
复制
/**
代码语言:javascript
复制
 * BootInterceptor
代码语言:javascript
复制
 */
代码语言:javascript
复制
public class BootInterceptor implements HandlerInterceptor {
代码语言:javascript
复制
...

注册:WebMvcConfigurerAdapter->addInterceptor方法。

代码语言:javascript
复制
@Configuration
代码语言:javascript
复制
public class ApplicationConfig {
代码语言:javascript
复制
代码语言:javascript
复制
    @Configuration
代码语言:javascript
复制
    public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
代码语言:javascript
复制
代码语言:javascript
复制
        public void addInterceptors(InterceptorRegistry registry) {
代码语言:javascript
复制
            registry.addInterceptor(new BootInterceptor()).addPathPatterns("/**");
代码语言:javascript
复制
            super.addInterceptors(registry);
代码语言:javascript
复制
        }
代码语言:javascript
复制
代码语言:javascript
复制
...
代码语言:javascript
复制
3. listenenr:实现各种listener
代码语言:javascript
复制
@WebListener
代码语言:javascript
复制
public class BootListener implements ServletContextListener {
代码语言:javascript
复制
...

二、mybatis配置集成,多数据源配置

配置文件:

1. 接口方式开发dao,扫描包配置 :@MapperScan(basePackages = "org.windwant.spring.mapper")

2. 配置dataSource,sqlSessionFactory

datasource 根据application.yml配置的数据源配置

application.yml

代码语言:javascript
复制
datasource:
代码语言:javascript
复制
    local:
代码语言:javascript
复制
        url: $[datasource.local.url]
代码语言:javascript
复制
        username: $[datasource.local.user]
代码语言:javascript
复制
        password: $[datasource.local.password]
代码语言:javascript
复制
        driverClassName: com.mysql.jdbc.Driver
代码语言:javascript
复制
        type: org.apache.commons.dbcp.BasicDataSource
代码语言:javascript
复制
        max-active: 30
代码语言:javascript
复制
        max-idle: 10
代码语言:javascript
复制
        max-wait: 10
代码语言:javascript
复制
        test-while-idle: true
代码语言:javascript
复制
    remote:
代码语言:javascript
复制
        url: $[datasource.remote.url]
代码语言:javascript
复制
        username: $[datasource.remote.user]
代码语言:javascript
复制
        password: $[datasource.remote.password]
代码语言:javascript
复制
        driverClassName: com.mysql.jdbc.Driver
代码语言:javascript
复制
        type: org.apache.commons.dbcp.BasicDataSource
代码语言:javascript
复制
        max-active: 30
代码语言:javascript
复制
        max-idle: 10
代码语言:javascript
复制
        max-wait: 10
代码语言:javascript
复制
        test-while-idle: true
代码语言:javascript
复制

DataSource 注解配置:

代码语言:javascript
复制
/**
代码语言:javascript
复制
 * Created by windwant on 2016/12/30.
代码语言:javascript
复制
 * implements EnvironmentAware, ApplicationContextAware
代码语言:javascript
复制
 */
代码语言:javascript
复制
@Configuration
代码语言:javascript
复制
public class MybatisConfig {
代码语言:javascript
复制
代码语言:javascript
复制
//    private Environment environment;
代码语言:javascript
复制
//
代码语言:javascript
复制
//    @Override
代码语言:javascript
复制
//    public void setEnvironment(Environment environment) {
代码语言:javascript
复制
//        this.environment = environment;
代码语言:javascript
复制
//    }
代码语言:javascript
复制
代码语言:javascript
复制
    @Primary
代码语言:javascript
复制
    @Bean(name = "localDataSource")
代码语言:javascript
复制
    @Order(value = 1)
代码语言:javascript
复制
    @ConfigurationProperties(prefix = "datasource.local")
代码语言:javascript
复制
    public DataSource localDataSource(){
代码语言:javascript
复制
        return DataSourceBuilder.create().build();
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @Order(value = 2)
代码语言:javascript
复制
    @Bean(name = "remoteDataSource")
代码语言:javascript
复制
    @ConfigurationProperties(prefix = "datasource.remote")
代码语言:javascript
复制
    public DataSource remoteDataSource() {
代码语言:javascript
复制
        return DataSourceBuilder.create().build();
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @Bean(name = "routingDataSource")
代码语言:javascript
复制
    @Order(value = 3)
代码语言:javascript
复制
    public DataSource routingDataSource(@Qualifier("localDataSource") DataSource localDataSource,
代码语言:javascript
复制
                                        @Qualifier("remoteDataSource") BasicDataSource remoteDataSource){
代码语言:javascript
复制
        RoutingDataSource routingDataSource = new RoutingDataSource();
代码语言:javascript
复制
        Map<Object, Object> dataSources = new HashMap<>();
代码语言:javascript
复制
        dataSources.put(Type.LOCAL.name(), localDataSource);
代码语言:javascript
复制
        dataSources.put(Type.REMOTE.name(), remoteDataSource);
代码语言:javascript
复制
        routingDataSource.setTargetDataSources(dataSources);
代码语言:javascript
复制
        routingDataSource.setDefaultTargetDataSource(localDataSource);
代码语言:javascript
复制
        return routingDataSource;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    @Order(value = 4)
代码语言:javascript
复制
    @Lazy
代码语言:javascript
复制
    public SqlSessionFactory sqlSessionFactory(@Qualifier("remoteDataSource") DataSource remoteDataSource,
代码语言:javascript
复制
                                               @Qualifier("localDataSource") DataSource localDataSource,
代码语言:javascript
复制
                                               @Qualifier("routingDataSource") DataSource routingDataSource) throws Exception {
代码语言:javascript
复制
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
代码语言:javascript
复制
        factoryBean.setDataSource(routingDataSource);
代码语言:javascript
复制
        factoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
代码语言:javascript
复制
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/*.xml"));
代码语言:javascript
复制
        factoryBean.afterPropertiesSet();
代码语言:javascript
复制
        return factoryBean.getObject();
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
//    private ApplicationContext ctx;
代码语言:javascript
复制
//
代码语言:javascript
复制
//    @Override
代码语言:javascript
复制
//    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
代码语言:javascript
复制
//        this.ctx = applicationContext;
代码语言:javascript
复制
//    }
代码语言:javascript
复制
}

项目添加Bean配置:

代码语言:javascript
复制
@Bean
代码语言:javascript
复制
public MapperScannerConfigurer mapperScannerConfigurer() {
代码语言:javascript
复制
    MapperScannerConfigurerProxy mapperScannerConfigurerProxy = new MapperScannerConfigurerProxy();
代码语言:javascript
复制
    mapperScannerConfigurerProxy.setBasePackage("org.windwant.spring.mapper");
代码语言:javascript
复制
    return mapperScannerConfigurerProxy;
代码语言:javascript
复制
}
代码语言:javascript
复制

三、集成jmx监控 MBean

代码语言:javascript
复制
/**
代码语言:javascript
复制
 * Created by windwant on 2017/4/6.
代码语言:javascript
复制
 * JMX Mbean 监控 可以通过jconsole进行mbean暴露操作
代码语言:javascript
复制
 */
代码语言:javascript
复制
@Component
代码语言:javascript
复制
@ManagedResource(description = "sboot svr")
代码语言:javascript
复制
public class WAMBean {
代码语言:javascript
复制
    // 属性
代码语言:javascript
复制
    private String name;
代码语言:javascript
复制
    private int age;
代码语言:javascript
复制
    private String message;
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedAttribute
代码语言:javascript
复制
    public String getName() {
代码语言:javascript
复制
        System.out.println("name: " + name);
代码语言:javascript
复制
        return name;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedAttribute
代码语言:javascript
复制
    public void setName(String name) {
代码语言:javascript
复制
        this.name = name;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedAttribute
代码语言:javascript
复制
    public int getAge() {
代码语言:javascript
复制
        System.out.println("age: "+age);
代码语言:javascript
复制
        return age;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedAttribute
代码语言:javascript
复制
    public void setAge(int age) {
代码语言:javascript
复制
        this.age = age;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedAttribute
代码语言:javascript
复制
    public String getMessage() {
代码语言:javascript
复制
        System.out.println("message: " + message);
代码语言:javascript
复制
        return message;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedAttribute
代码语言:javascript
复制
    public void setMessage(String message) {
代码语言:javascript
复制
        this.message = message;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedOperation
代码语言:javascript
复制
    @ManagedOperationParameter(name = "message", description = "message")
代码语言:javascript
复制
    public void call(String message) {
代码语言:javascript
复制
        System.out.println("call:" + message);
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedOperation
代码语言:javascript
复制
    @ManagedOperationParameter(name = "who", description = "who")
代码语言:javascript
复制
    @ManagedOperationParameter(name = "what", description = "what")
代码语言:javascript
复制
    public void look(String who, String what){
代码语言:javascript
复制
        System.out.println(who + " 发现了 " + what);
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @Autowired
代码语言:javascript
复制
    FTPTransport ftpTransport;
代码语言:javascript
复制
代码语言:javascript
复制
    @ManagedOperation
代码语言:javascript
复制
    public void upload() throws FileNotFoundException {
代码语言:javascript
复制
        FileInputStream f = null;
代码语言:javascript
复制
        try {
代码语言:javascript
复制
            f = new FileInputStream(new File("D:\\a.json"));
代码语言:javascript
复制
            ftpTransport.uploadFile("ajson", f);
代码语言:javascript
复制
        }catch (Exception e){
代码语言:javascript
复制
            e.printStackTrace();
代码语言:javascript
复制
        }finally {
代码语言:javascript
复制
            try {
代码语言:javascript
复制
                if(f != null){
代码语言:javascript
复制
                    f.close();
代码语言:javascript
复制
                }
代码语言:javascript
复制
            }catch (Exception e){
代码语言:javascript
复制
                e.printStackTrace();
代码语言:javascript
复制
            }
代码语言:javascript
复制
        }
代码语言:javascript
复制
代码语言:javascript
复制
        System.out.println("to play....");
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
}
代码语言:javascript
复制
四:定时任务配置 Scheduled 
代码语言:javascript
复制
@Component
代码语言:javascript
复制
public class BootJob {
代码语言:javascript
复制
代码语言:javascript
复制
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
代码语言:javascript
复制
代码语言:javascript
复制
    @Scheduled(fixedRate = 1000)
代码语言:javascript
复制
    public void reportTime(){
代码语言:javascript
复制
        System.out.println("current time is: " +  dateFormat.format(new Date()));
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
代码语言:javascript
复制
五:参数验证
代码语言:javascript
复制
代码语言:javascript
复制
参数Bean:验证注解 @NotBlank @NotNull等
代码语言:javascript
复制
public class Guest {
代码语言:javascript
复制
    @NotBlank(message = "{guest.name}")
代码语言:javascript
复制
    private String name;
代码语言:javascript
复制
代码语言:javascript
复制
    private Integer sex;

Controller:参数添加@Valid注解

代码语言:javascript
复制
@RequestMapping("/hellox")
代码语言:javascript
复制
Map<String, Object> hellox(@Valid Guest guest, BindingResult result){
代码语言:javascript
复制
    if(result.hasErrors()){
代码语言:javascript
复制
        return Response.response(-1, Constants.FAILED, result.getAllErrors());
代码语言:javascript
复制
    }
代码语言:javascript
复制
使用lang验证提示信息:
代码语言:javascript
复制
@Bean
代码语言:javascript
复制
public LocalValidatorFactoryBean localValidatorFactoryBean(){
代码语言:javascript
复制
    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
代码语言:javascript
复制
    localValidatorFactoryBean.setProviderClass(HibernateValidator.class);
代码语言:javascript
复制
    ReloadableResourceBundleMessageSource rrbms = new ReloadableResourceBundleMessageSource();
代码语言:javascript
复制
    rrbms.setBasename("classpath:/lang/messages");
代码语言:javascript
复制
    rrbms.setUseCodeAsDefaultMessage(false);
代码语言:javascript
复制
    rrbms.setDefaultEncoding("UTF-8");
代码语言:javascript
复制
    localValidatorFactoryBean.setValidationMessageSource(rrbms);
代码语言:javascript
复制
    return localValidatorFactoryBean;
代码语言:javascript
复制
}
代码语言:javascript
复制
六:跨域处理 Cors 
代码语言:javascript
复制
代码语言:javascript
复制
配置WebMvcConfigureAdapter addCorsMappings
代码语言:javascript
复制
addMapping:请求拦截
代码语言:javascript
复制
allowedOrigins:拦截请求源
代码语言:javascript
复制
allowedMethods:拦截方法
代码语言:javascript
复制
@Configuration
代码语言:javascript
复制
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
代码语言:javascript
复制
代码语言:javascript
复制
    public void addInterceptors(InterceptorRegistry registry) {
代码语言:javascript
复制
        registry.addInterceptor(new BootInterceptor()).addPathPatterns("/**");
代码语言:javascript
复制
            super.addInterceptors(registry);
代码语言:javascript
复制
        }
代码语言:javascript
复制
代码语言:javascript
复制
        /**
代码语言:javascript
复制
         * 跨域处理 映射所有路径 允许所有来源 以下方法请求
代码语言:javascript
复制
         * @param registry
代码语言:javascript
复制
         */
代码语言:javascript
复制
        @Override
代码语言:javascript
复制
        public void addCorsMappings(CorsRegistry registry) {
代码语言:javascript
复制
            registry.addMapping("/**")
代码语言:javascript
复制
                    .allowedOrigins("*")
代码语言:javascript
复制
                    .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH");
代码语言:javascript
复制
        }
代码语言:javascript
复制
代码语言:javascript
复制
七:shiro权限配置
代码语言:javascript
复制
代码语言:javascript
复制
@Configuration
代码语言:javascript
复制
public class ShiroConfig implements EnvironmentAware {
代码语言:javascript
复制
代码语言:javascript
复制
	private final static int REMEMBER_ME_MAX_AGE = 365 * 24 * 3600;
代码语言:javascript
复制
代码语言:javascript
复制
	// 这是个DestructionAwareBeanPostProcessor的子类,负责org.apache.shiro.util.Initializable类型bean的生命周期的,
代码语言:javascript
复制
	// 初始化和销毁。主要是AuthorizingRealm类的子类,以及EhCacheManager类
代码语言:javascript
复制
	@Bean(name = "lifecycleBeanPostProcessor")
代码语言:javascript
复制
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
代码语言:javascript
复制
        return new LifecycleBeanPostProcessor();
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
	@Bean
代码语言:javascript
复制
	public SimpleCookie rememberMeCookie(){
代码语言:javascript
复制
	      SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
代码语言:javascript
复制
	      simpleCookie.setMaxAge(REMEMBER_ME_MAX_AGE);
代码语言:javascript
复制
	      return simpleCookie;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	@Bean
代码语言:javascript
复制
	public CookieRememberMeManager rememberMeManager(){
代码语言:javascript
复制
	      CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
代码语言:javascript
复制
	      cookieRememberMeManager.setCookie(rememberMeCookie());
代码语言:javascript
复制
	      //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
代码语言:javascript
复制
	      cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
代码语言:javascript
复制
	      return cookieRememberMeManager;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	// 为了对密码进行编码的,防止密码在数据库里明码保存,当然在登陆认证,这个类也负责对form里输入的密码进行编码。
代码语言:javascript
复制
	@Bean(name = "hashedCredentialsMatcher")
代码语言:javascript
复制
	public HashedCredentialsMatcher hashedCredentialsMatcher() {
代码语言:javascript
复制
		HashedCredentialsMatcher credentialsMatcher = new ComHashedCredentialsMatcher();
代码语言:javascript
复制
		credentialsMatcher.setHashAlgorithmName("MD5");//散列算法:这里使用MD5算法;
代码语言:javascript
复制
		credentialsMatcher.setHashIterations(1);//散列的次数,比如散列两次,相当于 md5(md5(""));
代码语言:javascript
复制
		credentialsMatcher.setStoredCredentialsHexEncoded(true);//true时密码加密用的是Hex编码;false时用Base64编码
代码语言:javascript
复制
		return credentialsMatcher;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	// 增加缓存减少对数据库的查询压力
代码语言:javascript
复制
	@Bean(name = "ehcacheManager")
代码语言:javascript
复制
    public EhCacheManager getEhCacheManager() {  
代码语言:javascript
复制
        EhCacheManager em = new EhCacheManager();  
代码语言:javascript
复制
        em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");  
代码语言:javascript
复制
        return em;  
代码语言:javascript
复制
    }  
代码语言:javascript
复制
代码语言:javascript
复制
	// 自定义的认证类,继承自AuthorizingRealm,负责用户的认证和权限的处理
代码语言:javascript
复制
	@Bean(name = "shiroRealm")
代码语言:javascript
复制
    public MyAuthorizingRealm shiroRealm() {
代码语言:javascript
复制
		MyAuthorizingRealm realm = new MyAuthorizingRealm();
代码语言:javascript
复制
		realm.setCredentialsMatcher(hashedCredentialsMatcher());
代码语言:javascript
复制
        realm.setCachingEnabled(true);
代码语言:javascript
复制
        realm.setCacheManager(getEhCacheManager());
代码语言:javascript
复制
        return realm;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
	//权限管理,这个类组合了登陆,登出,权限,session的处理
代码语言:javascript
复制
	@Bean(name = "securityManager")
代码语言:javascript
复制
	public DefaultWebSecurityManager securityManager(){
代码语言:javascript
复制
		DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
代码语言:javascript
复制
		securityManager.setRealm(shiroRealm());
代码语言:javascript
复制
		securityManager.setCacheManager(getEhCacheManager());
代码语言:javascript
复制
		securityManager.setRememberMeManager(rememberMeManager());
代码语言:javascript
复制
        DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
代码语言:javascript
复制
        defaultWebSessionManager.setGlobalSessionTimeout(Long.parseLong(environment.getProperty("session.timeout")));
代码语言:javascript
复制
        securityManager.setSessionManager(defaultWebSessionManager);
代码语言:javascript
复制
        return securityManager;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	// 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证 * 配置以下
代码语言:javascript
复制
	// 两个bean(DefaultAdvisorAutoProxyCreator(可选)和AuthorizationAttributeSourceAdvisor)即可实现此功能
代码语言:javascript
复制
	@Bean(name = "advisorAutoProxyCreator")
代码语言:javascript
复制
    @DependsOn({"lifecycleBeanPostProcessor"})
代码语言:javascript
复制
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
代码语言:javascript
复制
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
代码语言:javascript
复制
        advisorAutoProxyCreator.setProxyTargetClass(true);
代码语言:javascript
复制
        return advisorAutoProxyCreator;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
	@Bean(name = "authorizationAttributeSourceAdvisor")
代码语言:javascript
复制
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(){
代码语言:javascript
复制
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
代码语言:javascript
复制
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
代码语言:javascript
复制
        return authorizationAttributeSourceAdvisor;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @Bean(name = "shiroFilter")
代码语言:javascript
复制
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
代码语言:javascript
复制
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
代码语言:javascript
复制
代码语言:javascript
复制
        shiroFilterFactoryBean.getFilters().put("comauth", new ComAuthFilter());
代码语言:javascript
复制
代码语言:javascript
复制
        shiroFilterFactoryBean.setSecurityManager(securityManager());
代码语言:javascript
复制
        shiroFilterFactoryBean.setLoginUrl("/");
代码语言:javascript
复制
        shiroFilterFactoryBean.setSuccessUrl("/index");
代码语言:javascript
复制
        shiroFilterFactoryBean.setUnauthorizedUrl("/notlogin");
代码语言:javascript
复制
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
代码语言:javascript
复制
        filterChainDefinitionMap.put("/", "user");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/css/**", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/js/**", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/img/**", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/**.html", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/login", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/login/checkcode", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/login/notlogin", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/export", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/spiCalc", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/hello/**", "anon"); //配置不控制权限请求 anon
代码语言:javascript
复制
        filterChainDefinitionMap.put("/hellox", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/", "anon");
代码语言:javascript
复制
        filterChainDefinitionMap.put("/**", "comauth");
代码语言:javascript
复制
代码语言:javascript
复制
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
代码语言:javascript
复制
代码语言:javascript
复制
        return shiroFilterFactoryBean;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    private Environment environment;
代码语言:javascript
复制
代码语言:javascript
复制
    @Override
代码语言:javascript
复制
    public void setEnvironment(Environment environment) {
代码语言:javascript
复制
        this.environment = environment;
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
八、Consul服务注册与发现
代码语言:javascript
复制
/**
代码语言:javascript
复制
 * consul agent -server -bootstrap-expect=1  -data-dir=data -node=server0 -bind=127.0.0.1 -client 0.0.0.0 -ui
代码语言:javascript
复制
 * Created by windwant on 2016/8/18.
代码语言:javascript
复制
 */
代码语言:javascript
复制
@Component
代码语言:javascript
复制
public class ConsulMgr {
代码语言:javascript
复制
代码语言:javascript
复制
    private static final Logger logger = LoggerFactory.getLogger(ConsulMgr.class);
代码语言:javascript
复制
代码语言:javascript
复制
    @org.springframework.beans.factory.annotation.Value("${consul.host}")
代码语言:javascript
复制
    private String consulHost;
代码语言:javascript
复制
    @org.springframework.beans.factory.annotation.Value("${server.port}")
代码语言:javascript
复制
    private Integer port;
代码语言:javascript
复制
代码语言:javascript
复制
    @org.springframework.beans.factory.annotation.Value("${redis.host}")
代码语言:javascript
复制
    private String redisHost;
代码语言:javascript
复制
代码语言:javascript
复制
    @org.springframework.beans.factory.annotation.Value("${redis.port}")
代码语言:javascript
复制
    private Integer redisPort;
代码语言:javascript
复制
代码语言:javascript
复制
    private KeyValueClient keyValueClient;
代码语言:javascript
复制
    private HealthClient healthClient;
代码语言:javascript
复制
    private AgentClient agentClient;
代码语言:javascript
复制
    private CatalogClient catalogClient;
代码语言:javascript
复制
    private String redisService = "redis";
代码语言:javascript
复制
    private String bootService = "boot";
代码语言:javascript
复制
代码语言:javascript
复制
    public void init(){
代码语言:javascript
复制
        Consul consul = Consul.builder()
代码语言:javascript
复制
                .withConnectTimeoutMillis(3000)
代码语言:javascript
复制
                .withPing(true)
代码语言:javascript
复制
                .withReadTimeoutMillis(2000)
代码语言:javascript
复制
                .withWriteTimeoutMillis(2000)
代码语言:javascript
复制
                .withHostAndPort(HostAndPort.fromParts(consulHost, 8500)).build();
代码语言:javascript
复制
        keyValueClient = consul.keyValueClient();
代码语言:javascript
复制
        healthClient = consul.healthClient();
代码语言:javascript
复制
        agentClient = consul.agentClient();
代码语言:javascript
复制
代码语言:javascript
复制
        //注册本服务到consul
代码语言:javascript
复制
        registerService(bootService, bootService, bootService, consulHost, port, 5);
代码语言:javascript
复制
代码语言:javascript
复制
        //注册测试redis服务
代码语言:javascript
复制
        registerService(redisService, redisService, redisService, redisHost, redisPort, 5);
代码语言:javascript
复制
代码语言:javascript
复制
        //获取可用redis服务
代码语言:javascript
复制
        getHealthService(redisService);
代码语言:javascript
复制
代码语言:javascript
复制
        //监控redis服务
代码语言:javascript
复制
        watchSvrx();
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * 注册服务
代码语言:javascript
复制
     */
代码语言:javascript
复制
    public void registerService(String svrId, String svrName, String tags, String host, Integer port, Integer interval){
代码语言:javascript
复制
        //健康检查
代码语言:javascript
复制
        ImmutableRegCheck immutableRegCheck = ImmutableRegCheck.builder().tcp(host + ":" + port).interval(interval + "s").build();
代码语言:javascript
复制
        ImmutableRegistration immutableRegistration = ImmutableRegistration.builder().
代码语言:javascript
复制
                id(svrId).
代码语言:javascript
复制
                name(svrName).
代码语言:javascript
复制
                addTags(tags).
代码语言:javascript
复制
                address(host).
代码语言:javascript
复制
                port(port).
代码语言:javascript
复制
                addChecks(immutableRegCheck).
代码语言:javascript
复制
                build();
代码语言:javascript
复制
        agentClient.register(immutableRegistration);
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * 获取正常服务
代码语言:javascript
复制
     * @param serviceName
代码语言:javascript
复制
     */
代码语言:javascript
复制
    public void getHealthService(String serviceName){
代码语言:javascript
复制
        List<ServiceHealth> nodes = healthClient.getHealthyServiceInstances(serviceName).getResponse();
代码语言:javascript
复制
        dealHealthSvr(nodes);
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    private void dealHealthSvr(List<ServiceHealth> services){
代码语言:javascript
复制
        if(StringUtils.isNotBlank(JedisUtils.getHost()) && services.size() > 0) {
代码语言:javascript
复制
            services.forEach((resp) -> {
代码语言:javascript
复制
                if (StringUtils.equals(resp.getService().getAddress(), JedisUtils.getHost()) &&
代码语言:javascript
复制
                        resp.getService().getPort() == JedisUtils.getPort()) {
代码语言:javascript
复制
                    if(JedisUtils.getJedisPool().isClosed()){
代码语言:javascript
复制
                        JedisUtils.init(resp.getService().getAddress(), resp.getService().getPort());
代码语言:javascript
复制
                        return;
代码语言:javascript
复制
                    }
代码语言:javascript
复制
                    return;
代码语言:javascript
复制
                }
代码语言:javascript
复制
            });
代码语言:javascript
复制
        }
代码语言:javascript
复制
代码语言:javascript
复制
        if(StringUtils.isBlank(JedisUtils.getHost()) && services.size() > 0) {
代码语言:javascript
复制
            services.forEach((resp) -> {
代码语言:javascript
复制
                Service service = resp.getService();
代码语言:javascript
复制
                System.out.println("service port: " + service.getPort());
代码语言:javascript
复制
                System.out.println("service address: " + service.getAddress());
代码语言:javascript
复制
代码语言:javascript
复制
                //选取一个服务器初始化redis jedispool
代码语言:javascript
复制
                if (JedisUtils.init(service.getAddress(), service.getPort())) {
代码语言:javascript
复制
                    return;
代码语言:javascript
复制
                }
代码语言:javascript
复制
            });
代码语言:javascript
复制
        }
代码语言:javascript
复制
代码语言:javascript
复制
        if(JedisUtils.getJedisPool() != null) {
代码语言:javascript
复制
            //测试redis
代码语言:javascript
复制
            JedisUtils.set("test key", "test value");
代码语言:javascript
复制
            JedisUtils.get("test key");
代码语言:javascript
复制
            //测试redis分布式锁
代码语言:javascript
复制
            JedisUtils.setLockKey("test lock key", "test lock value", 3);
代码语言:javascript
复制
            JedisUtils.get("test lock key");
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    //监控redis可用服务
代码语言:javascript
复制
    ScheduledExecutorService scheduled = Executors.newSingleThreadScheduledExecutor();
代码语言:javascript
复制
代码语言:javascript
复制
    public void watchSvrx(){
代码语言:javascript
复制
        scheduled.scheduleAtFixedRate(new Runnable() {
代码语言:javascript
复制
            @Override
代码语言:javascript
复制
            public void run() {
代码语言:javascript
复制
                getHealthService(redisService);
代码语言:javascript
复制
            }
代码语言:javascript
复制
        }, 0, 10, TimeUnit.SECONDS);
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
代码语言:javascript
复制
    public void watchSvr(){
代码语言:javascript
复制
        try {
代码语言:javascript
复制
            ServiceHealthCache serviceHealthCache = ServiceHealthCache
代码语言:javascript
复制
                    .newCache(healthClient, redisService);
代码语言:javascript
复制
            serviceHealthCache.addListener(map -> {
代码语言:javascript
复制
                logger.info("ServiceHealthCache change event");
代码语言:javascript
复制
                List<ServiceHealth> list = new ArrayList<ServiceHealth>();
代码语言:javascript
复制
                for (ServiceHealth serviceHealth : map.values()) {
代码语言:javascript
复制
                    list.add(serviceHealth);
代码语言:javascript
复制
                }
代码语言:javascript
复制
                ConsulMgr.this.dealHealthSvr(list);
代码语言:javascript
复制
            });
代码语言:javascript
复制
            serviceHealthCache.start();
代码语言:javascript
复制
        } catch (Exception e) {
代码语言:javascript
复制
            logger.info("ServiceHealthCache e: {}", e);
代码语言:javascript
复制
        }
代码语言:javascript
复制
    }
代码语言:javascript
复制
}
代码语言:javascript
复制
代码语言:javascript
复制
九、reids分布式锁
代码语言:javascript
复制
代码语言:javascript
复制
public class JedisUtils {
代码语言:javascript
复制
	private static final Logger logger = LoggerFactory.getLogger(JedisUtils.class);
代码语言:javascript
复制
代码语言:javascript
复制
	//设置锁的lua脚本
代码语言:javascript
复制
	private static final String SETNX_EXPIRE_SCRIPT = "if redis.call('setnx', KEYS[1], KEYS[2]) == 1 then\n"
代码语言:javascript
复制
			+ "return redis.call('expire', KEYS[1], KEYS[3]);\n" + "end\n" + "return nil;";
代码语言:javascript
复制
代码语言:javascript
复制
	private static JedisPool jedisPool;
代码语言:javascript
复制
代码语言:javascript
复制
	public static JedisPool getJedisPool() {
代码语言:javascript
复制
		return jedisPool;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static void setJedisPool(JedisPool jedisPool) {
代码语言:javascript
复制
		JedisUtils.jedisPool = jedisPool;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	private static String host;
代码语言:javascript
复制
代码语言:javascript
复制
	private static Integer port;
代码语言:javascript
复制
代码语言:javascript
复制
	public static String getHost() {
代码语言:javascript
复制
		return host;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static void setHost(String host) {
代码语言:javascript
复制
		JedisUtils.host = host;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static Integer getPort() {
代码语言:javascript
复制
		return port;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static void setPort(Integer port) {
代码语言:javascript
复制
		JedisUtils.port = port;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static boolean init(String host, Integer port){
代码语言:javascript
复制
		try {
代码语言:javascript
复制
			JedisUtils.host = host;
代码语言:javascript
复制
			JedisUtils.port = port;
代码语言:javascript
复制
			jedisPool = new JedisPool(host, port);
代码语言:javascript
复制
			System.out.println(jedisPool);
代码语言:javascript
复制
			return true;
代码语言:javascript
复制
		}catch (Exception e){}
代码语言:javascript
复制
		return false;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static boolean checkExist(String key) {
代码语言:javascript
复制
		if(jedisPool == null) return false;
代码语言:javascript
复制
		try (Jedis jedis = jedisPool.getResource()) {
代码语言:javascript
复制
			logger.info("get redis key record: {}", jedis.get(key));
代码语言:javascript
复制
			return jedis.exists(key);
代码语言:javascript
复制
		}catch (Exception e) {
代码语言:javascript
复制
			logger.warn("get redis key record failed , the message is " + e.getMessage());
代码语言:javascript
复制
		}
代码语言:javascript
复制
		return false;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static void set(String key, String value) {
代码语言:javascript
复制
		if(jedisPool == null) return;
代码语言:javascript
复制
		try (Jedis jedis = jedisPool.getResource()) {
代码语言:javascript
复制
			logger.info("set key: {}, value: {}", key, value);
代码语言:javascript
复制
			jedis.set(key, value);
代码语言:javascript
复制
			jedis.expire(key, 20);
代码语言:javascript
复制
		}catch (Exception e) {
代码语言:javascript
复制
			logger.warn("set key failed , the message is " + e.getMessage());
代码语言:javascript
复制
		}
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	public static String get(String key) {
代码语言:javascript
复制
		if(jedisPool == null) return null;
代码语言:javascript
复制
		try (Jedis jedis = jedisPool.getResource()) {
代码语言:javascript
复制
			String value = jedis.get(key);
代码语言:javascript
复制
			logger.info("get key: {}, value: {}", key, value);
代码语言:javascript
复制
			return value;
代码语言:javascript
复制
		}catch (Exception e) {
代码语言:javascript
复制
			logger.warn("get key failed , the message is " + e.getMessage());
代码语言:javascript
复制
		}
代码语言:javascript
复制
		return null;
代码语言:javascript
复制
	}
代码语言:javascript
复制
代码语言:javascript
复制
	/**
代码语言:javascript
复制
	 * 设置锁的lua脚本
代码语言:javascript
复制
	 * private static final String SETNX_EXPIRE_SCRIPT = "if redis.call('setnx', KEYS[1], KEYS[2]) == 1 then\n"
代码语言:javascript
复制
	 * "return redis.call('expire', KEYS[1], KEYS[3]);\n" + "end\n" + "return nil;";
代码语言:javascript
复制
	 *
代码语言:javascript
复制
	 * @param key
代码语言:javascript
复制
	 * @return
代码语言:javascript
复制
	 */
代码语言:javascript
复制
	public static boolean setLockKey(String key, String value, Integer seconds) {
代码语言:javascript
复制
		if (jedisPool == null) return false;
代码语言:javascript
复制
		try (Jedis jedis = jedisPool.getResource()) {
代码语言:javascript
复制
			if(jedis.eval(SETNX_EXPIRE_SCRIPT, 3, key, value, String.valueOf(seconds)) != null){
代码语言:javascript
复制
				logger.info("set lock key: {}, value: {}", key, value);
代码语言:javascript
复制
				return true;
代码语言:javascript
复制
			}
代码语言:javascript
复制
		}catch (Exception e) {
代码语言:javascript
复制
			logger.warn("set lock key failed , the message is " + e.getMessage());
代码语言:javascript
复制
		}
代码语言:javascript
复制
		return false;
代码语言:javascript
复制
	}
代码语言:javascript
复制
}
代码语言:javascript
复制
代码语言:javascript
复制
十、SPI机制

参考:Java SPI机制

代码语言:javascript
复制
代码语言:javascript
复制
十一、static资源
代码语言:javascript
复制
代码语言:javascript
复制
配置个性化资源路径:
代码语言:javascript
复制
@Configuration
代码语言:javascript
复制
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
代码语言:javascript
复制
代码语言:javascript
复制
    @Override
代码语言:javascript
复制
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
代码语言:javascript
复制
        registry.addResourceHandler("/uploadImg/**").addResourceLocations("file:/data/share/plane_images/");
代码语言:javascript
复制
        super.addResourceHandlers(registry);
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
十二、druid数据源
代码语言:javascript
复制
代码语言:javascript
复制
package org.windwant.spring.config;
代码语言:javascript
复制
代码语言:javascript
复制
import com.alibaba.druid.support.http.StatViewServlet;
代码语言:javascript
复制
import com.alibaba.druid.support.http.WebStatFilter;
代码语言:javascript
复制
import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator;
代码语言:javascript
复制
import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
代码语言:javascript
复制
import org.springframework.aop.framework.ProxyFactoryBean;
代码语言:javascript
复制
import org.springframework.aop.support.DefaultPointcutAdvisor;
代码语言:javascript
复制
import org.springframework.aop.support.JdkRegexpMethodPointcut;
代码语言:javascript
复制
import org.springframework.boot.web.servlet.FilterRegistrationBean;
代码语言:javascript
复制
import org.springframework.boot.web.servlet.ServletRegistrationBean;
代码语言:javascript
复制
import org.springframework.context.annotation.Bean;
代码语言:javascript
复制
import org.springframework.context.annotation.Configuration;
代码语言:javascript
复制
import org.windwant.spring.service.BootService;
代码语言:javascript
复制
代码语言:javascript
复制
import java.util.Arrays;
代码语言:javascript
复制
代码语言:javascript
复制
/**
代码语言:javascript
复制
 * Created by Administrator on 2018/2/6.
代码语言:javascript
复制
 */
代码语言:javascript
复制
@Configuration
代码语言:javascript
复制
public class DruidConfig {
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * 注册 StatViewServlet druid web页面使用
代码语言:javascript
复制
     * @return
代码语言:javascript
复制
     */
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public ServletRegistrationBean druidServlet() {
代码语言:javascript
复制
        ServletRegistrationBean reg = new ServletRegistrationBean();
代码语言:javascript
复制
        reg.setServlet(new StatViewServlet());
代码语言:javascript
复制
        reg.addUrlMappings("/druid/*");
代码语言:javascript
复制
        return reg;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public FilterRegistrationBean druidWebStatFilter(){
代码语言:javascript
复制
        FilterRegistrationBean reg = new FilterRegistrationBean();
代码语言:javascript
复制
        reg.setFilter(new WebStatFilter());
代码语言:javascript
复制
        reg.setUrlPatterns(Arrays.asList("/*"));
代码语言:javascript
复制
        reg.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
代码语言:javascript
复制
        reg.addInitParameter("sessionStatMaxCount", "1000");
代码语言:javascript
复制
        reg.addInitParameter("sessionStatEnable", "true");
代码语言:javascript
复制
        reg.addInitParameter("principalSessionName", "druid.user");
代码语言:javascript
复制
        reg.addInitParameter("profileEnable", "true");
代码语言:javascript
复制
        return reg;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * Spring和Jdbc的关联监控。
代码语言:javascript
复制
     * DruidStatInterceptor:标准的Spring MethodInterceptor。可以灵活进行AOP配置
代码语言:javascript
复制
     * Advice
代码语言:javascript
复制
     * @return
代码语言:javascript
复制
     */
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public DruidStatInterceptor interceptorNames(){
代码语言:javascript
复制
        DruidStatInterceptor inc = new DruidStatInterceptor();
代码语言:javascript
复制
        return inc;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    //=====================按类型拦截 配置Spring监控============================================
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * 按类型拦截配置
代码语言:javascript
复制
     * @return
代码语言:javascript
复制
     */
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator(){
代码语言:javascript
复制
        BeanTypeAutoProxyCreator cut = new BeanTypeAutoProxyCreator();
代码语言:javascript
复制
        cut.setTargetBeanType(BootService.class);
代码语言:javascript
复制
        cut.setInterceptorNames("interceptorNames");
代码语言:javascript
复制
        return cut;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    //=====================按方法名正则匹配拦截 配置Spring监控====================================
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * pointcut
代码语言:javascript
复制
     * @return
代码语言:javascript
复制
     */
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public JdkRegexpMethodPointcut jdkRegexpMethodPointcut(){
代码语言:javascript
复制
        JdkRegexpMethodPointcut cut = new JdkRegexpMethodPointcut();
代码语言:javascript
复制
        cut.setPatterns("org.windwant.spring.mapper.*");
代码语言:javascript
复制
        return cut;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * Advisor
代码语言:javascript
复制
     * @param pointcut
代码语言:javascript
复制
     * @param interceptor
代码语言:javascript
复制
     * @return
代码语言:javascript
复制
     */
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public DefaultPointcutAdvisor defaultPointcutAdvisor(JdkRegexpMethodPointcut pointcut, DruidStatInterceptor interceptor){
代码语言:javascript
复制
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
代码语言:javascript
复制
        advisor.setPointcut(pointcut);
代码语言:javascript
复制
        advisor.setAdvice(interceptor);
代码语言:javascript
复制
        return advisor;
代码语言:javascript
复制
    }
代码语言:javascript
复制
代码语言:javascript
复制
    /**
代码语言:javascript
复制
     * AOP proxy based on beans in Spring
代码语言:javascript
复制
     * @return
代码语言:javascript
复制
     */
代码语言:javascript
复制
    @Bean
代码语言:javascript
复制
    public ProxyFactoryBean proxyFactoryBean(){
代码语言:javascript
复制
        ProxyFactoryBean proxy = new ProxyFactoryBean();
代码语言:javascript
复制
        proxy.setInterceptorNames("defaultPointcutAdvisor");
代码语言:javascript
复制
        return proxy;
代码语言:javascript
复制
    }
代码语言:javascript
复制
}

十三、dubbo rpc

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:javascript
复制
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
代码语言:javascript
复制
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
代码语言:javascript
复制
       xmlns:context="http://www.springframework.org/schema/context"
代码语言:javascript
复制
       xmlns="http://www.springframework.org/schema/beans"
代码语言:javascript
复制
       xsi:schemaLocation="http://www.springframework.org/schema/beans
代码语言:javascript
复制
       http://www.springframework.org/schema/beans/spring-beans.xsd
代码语言:javascript
复制
       http://code.alibabatech.com/schema/dubbo
代码语言:javascript
复制
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
代码语言:javascript
复制
代码语言:javascript
复制
    <context:property-placeholder location="classpath:application.yml"/>
代码语言:javascript
复制
代码语言:javascript
复制
    <dubbo:application name="${dubbo.application.name}" owner="boot-server"
代码语言:javascript
复制
                       organization="windwant"/>
代码语言:javascript
复制
代码语言:javascript
复制
    <dubbo:registry id="bootRegistry" address="${dubbo.registry.address}"/>
代码语言:javascript
复制
代码语言:javascript
复制
    <dubbo:protocol port="${dubbo.protocal.port}" serialization="${dubbo.protocal.serialization}"
代码语言:javascript
复制
                    dispatcher="all" optimizer="org.windwant.common.api.SerializationOptimizerImpl"
代码语言:javascript
复制
                    threadpool="cached" threads="${dubbo.provider.threads}"/>
代码语言:javascript
复制
代码语言:javascript
复制
    <dubbo:protocol id="publicApi" port="${dubbo.protocal.port}" serialization="${dubbo.protocal.serialization}"
代码语言:javascript
复制
                    dispatcher="all" threadpool="cached" threads="${dubbo.provider.threads}"/>
代码语言:javascript
复制
代码语言:javascript
复制
    <dubbo:provider timeout="${dubbo.provider.timeout}" filter="dubboCatFilter"
代码语言:javascript
复制
                    proxy="${dubbo.provider.proxy}" retries="${dubbo.provider.retries}"/>
代码语言:javascript
复制
代码语言:javascript
复制
    <dubbo:service interface="org.windwant.common.api.DubboService" ref="dubbosvr"
代码语言:javascript
复制
                   registry="bootRegistry"/>
代码语言:javascript
复制
</beans>

。。。

代码语言:javascript
复制

Spring Boot 官网:https://projects.spring.io/spring-boot/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-10-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档