spring service加上@autowired 空指针_Spring整合activeMQ和JsonP
七、 Spring 整合 ActiveMQ
1 创建 spring-activemq-producer
1.1 修改 POM 文件
添加spring的依赖 除此之外 还要加入activemq完整包 spring-jms包xbean-spring包 如果用到了连接池 还要加连接池包
1.2 整合 ActiveMQ 加入sprng封装的activeMQ配置
applicationContext-jms.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:jms="http://www.springframework.org/schema/jms" xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms.xsdhttp://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core.xsd"><!-- 需要创建一个连接工厂,连接ActiveMQ. ActiveMQConnectionFactory. 需要依赖ActiveMQ提供的amq标签 --><!-- amq:connectionFactory 是bean标签的子标签, 会在spring容器中创建一个bean对象.可以为对象命名. 类似: <bean id="" class="ActiveMQConnectionFactory"></bean>--><amq:connectionFactory brokerURL="tcp://192.168.142.6:61616"userName="admin" password="admin" id="amqConnectionFactory"/><!-- spring管理JMS相关代码的时候,必须依赖jms标签库. spring-jms提供的标签库. --><!-- 定义Spring-JMS中的连接工厂对象CachingConnectionFactory - spring框架提供的连接工厂对象. 不能真正的访问MOM容器.类似一个工厂的代理对象. 需要提供一个真实工厂,实现MOM容器的连接访问.--><bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"><property name="targetConnectionFactory" ref="amqConnectionFactory"></property><property name="sessionCacheSize" value="3"></property></bean><!-- 注册监听器 --><!-- 开始注册监听. 需要的参数有:acknowledge - 消息确认机制container-type - 容器类型 default|simplesimple:SimpleMessageListenerContainer最简单的消息监听器容器,只能处理固定数量的JMS会话,且不支持事务。default:DefaultMessageListenerContainer是一个用于异步消息监听器容器 ,且支持事务 destination-type - 目的地类型. 使用队列作为目的地.connection-factory - 连接工厂, spring-jms使用的连接工厂,必须是spring自主创建的不能使用三方工具创建的工程. 如: ActiveMQConnectionFactory.--><jms:listener-container acknowledge="auto" container-type="default"destination-type="queue" connection-factory="connectionFactory" ><!-- 在监听器容器中注册某监听器对象.destination - 设置目的地命名ref - 指定监听器对象--><jms:listener destination="test-spring" ref="myListener"/></jms:listener-container></beans>
2 创建 spring-activemq-consumer
是一个 jar 工程
2.1 修改 POM 文件
创建一个war工程,导入相关依赖。 加上spring-service springmvc springjsm 的配置。 创建pojo 创建service 创建service实现类(spring容器注入了activemq 因此只需要发送消息), 创建contriller。Jsp相关页面
2.2 整合 ActiveMQ
3 测试整合
需求:
1)在 producer 中创建 Users 对象
2)将 Users 对象传递到 ActiveMQ 中
3)在 Consumer 中获取 Users 对象并在控制台打印
3.1 Producer 发送消息
3.1.1 如果使用了连接池需要添加两个坐标
PooledConnectionFactoryBean
3.1.2 发送消息
package com.bjsxt.service.impl;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import com.bjsxt.pojo.Users;
import com.bjsxt.service.UserService;
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate JmsTemplate jmsTemplate;@Overridepublic void addUser(Users user) {//消息发送this.jmsTemplate.send(new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {Message message = session.createObjectMessage(user);return message;}});}}
3.2 Consumer 接收消息
3.2.1 接收消息
package com.bjsxt.listener;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.bjsxt.pojo.Users;
import com.bjsxt.service.UserService;
//消息监听器
@Component(value="myListener")
public class MyMessageListener implements MessageListener{@Autowiredprivate UserService userService;@Overridepublic void onMessage(Message message) {ObjectMessage objectMessage=(ObjectMessage)message;Users user = null;try {user = (Users)objectMessage.getObject();} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}/*Users user = (User)((ObjectMessage)message).getObject();*/userService.showMsg(user);}}
JsonP
一、 JsonP 简介
1 什么是 JsonP
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)
那获取资料,即跨域读取数据。
为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同
源策略。
2 什么是跨域?
跨域是指一个域(网站)下的文档或脚本试图去请求另一个域(网站)下的资源
3 什么是同源策略?
同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器,
它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策
略。如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指"协议+域
名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。
3.1 非同源策略限制以下几种行为:
1.) Cookie、LocalStorage 和 IndexDB 无法读取
2.) DOM 和 Js 对象无法获得
3.) AJAX 请求不能发送
4 常见跨域场景
URL 说明 是否允许通信
http://www.domain.com/a.js
http://www.domain.com/b.js 同一域名,不同文件或路径 允许
http://www.domain.com/lab/c.js
http://www.domain.com:8000/a.js
http://www.domain.com/b.js 同一域名,不同端口 不允许
http://www.domain.com/a.js
https://www.domain.com/b.js 同一域名,不同协议 不允许
http://www.domain.com/a.js
http://192.168.4.12/b.js 域名和域名对应相同 ip 不允许
http://www.domain.com/a.js
http://x.domain.com/b.js 主域相同,子域不同 不允许
http://domain.com/c.js
http://www.domain1.com/a.js
http://www.domain2.com/b.js 不同域名 不允许
5 跨域解决方案
1) 通过 jsonp 跨域
2) document.domain + iframe 跨域
3) location.hash + iframe
4) Dave Vieira-Kurz + iframe 跨域
5) postMessage 跨域
6) 跨域资源共享(CORS)
7) nginx 代理跨域
8) nodejs 中间件代理跨域
9) WebSocket 协议跨域
6 JsonP 优缺点
JSONP 的优点是:它不像 XMLHttpRequest 对象实现的 Ajax 请求那样受到同源策略的
限制;它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要 XMLHttpRequest 或
ActiveX 的支持;并且在请求完毕后可以通过调用 callback 的方式回传结果。
JSONP 的缺点则是:它只支持 GET 请求而不支持 POST 等其它类型的 HTTP 请求;它
只支持跨域 HTTP 请求这种情况,不能解决不同域的两个页面之间如何进行 JavaScript 调用
的问题。
二、 JsonP 的使用
1 搭建跨域场景
1.1 需求:
1)创建两个 web 工程,名称为 jsonDemo1(8080)、jsonDemo2(9090)
2)jsonDemo1 中提供一个 index.jsp。
3)在 jsonDemo1 的 index.jsp 中通过 Jquery 的 Ajax 跨域请求 jsonDemo2
4)jsonDemo2 中使用 springMVC 处理请求,返回一个 json 对象
5)在 jsonDemo1 中将返回的结果插入到 index.jsp 中
1.2 创建项目
1.2.1 jsonDemo1
pom文件里添加了spring的依赖和Tomcat配置
1.2.2 jsonDemo2
pom文件添加了spingmvc jsp json 依赖 tomcat端口9090
2 使用 JsonP 解决跨域
2.1 Ajax 跨域请求时会出现异常
2.2 在 ajax 中请求方式有所改变
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="/js/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){$("#but").click(function(){$.ajax({type:"get",url:"http://localhost:9090/user/findUser",dataType:"jsonp",jsonp:"callback",success:function(data){alert(data);var str = "";for(i=0;i<data.length;i++){str+= data[i].userid+" "+data[i].username+" "+data[i].userage+" ";}$("#show").html(str);}});});
});
</script>
</head>
<body><span id="show"></span><input type="button" value="OK" id="but"/>
</body>
</html>
2.3 请求的 Controller 需要改变
package com.bjsxt.web.controller;import java.util.ArrayList;
import java.util.List;import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.bjsxt.commons.JsonUtils;
import com.bjsxt.pojo.User;@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/findUser")@ResponseBodypublic Object findUser(String callback){User user=new User(1,"zhangsan",20);User user1=new User(2,"lisi",21);User user2=new User(3,"wangwu",22);List<User> list=new ArrayList<User>();list.add(user);list.add(user1);list.add(user2);//callback({id:1,name:zhangsan...})/*String str=JsonUtils.objectToJson(list);return callback+"("+str+")"*/;//利用spring去转换json-jsonpMappingJacksonValue mj=new MappingJacksonValue(list);mj.setJsonpFunction(callback);return mj;}
}
注意callback 是随意命名的 在前台用jsonp的时候 需要指明
jason-jsonp的转换 可以用自己的工具类 也可以用spring提供的方法
spring service加上@autowired 空指针_Spring整合activeMQ和JsonP相关推荐
- Spring整合ActiveMQ完成消息队列MQ编程
<–start–> 第一步:新建一个maven,将工程命名为activeMQ_spring.在pom.xml文件中导入相关jar包. ①spring开发和测试相关的jar包: spring ...
- ActiveMQ —— Spring 整合 ActiveMQ
前文 消息中间件 -- 简介 ActiveMQ 下载.安装 ActiveMQ -- Java 连接 ActiveMQ(点对点) ActiveMQ -- Java 连接 ActiveMQ(发布订阅 To ...
- java 消息队列详解_Java消息队列-Spring整合ActiveMq的详解
本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.概述 首先和大家一起回顾一下Java 消息服 ...
- 加上项目路径 spring security忽略不生效_Spring 常见面试题「收藏」
Spring 常见面试题 1 Spring框架是什么?它的主要模块有哪些? Spring框架是一个Java平台,提供全面的基础设施支持开发Java应用程序.Spring处理基础设施部分,这样你就可以专 ...
- Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析
Spring MVC 解读--@Autowired 一.@Autowired 作为一个Spring开发者对@Autowired注解必定是非常了解了, 顾名思义自动装配,应该是Spring会自动将我们标 ...
- autowired注解_Spring系列之Spring常用注解总结
作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...
- 实战06_SSM整合ActiveMQ支持多种类型消息
接上一篇:企业实战05_SSM整合ActiveMQ支持多种类型消息https://blog.csdn.net/weixin_40816738/article/details/100572129 1.S ...
- 实战05_SSM整合ActiveMQ支持多种类型消息
接上一篇:实战04_SSM整合ActiveMQ支持多种类型消息https://blog.csdn.net/weixin_40816738/article/details/100572124 1.Str ...
- activeMQ基础学习和SpringBoot整合activeMQ案例
昨天仔细研究了activeMQ消息队列,也遇到了些坑,昨天晚上也写了篇文章记录坑的内容,其实上篇文章(SpringBoot整合activeMQ消息队列手动签收(Session.CLIENT_ACKNO ...
- springboot整合ActiveMQ(点对点和发布订阅)
springboot整合ActiveMQ(点对点和发布订阅) ActiveMQ是什么,为什么使用MQ 是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件. 1.系统解耦 采用中间件之后, ...
最新文章
- Oralce日常高效率巡检_数据库性能、安全检查
- 指针系统学习7-返回指针值的函数
- 分布式计算引擎MapReduce
- java考题_Java考题知识点
- 同事就是同事,职场没有兄弟姐妹
- 入门微信小程序(含实战) [第九篇] -- 下拉刷新和上拉加载
- 玩转LiteOS组件:玩转Librws
- git笔记之解决eclipse不能提交jar等文件的问题
- 陆奇下下选,YC上上签
- Redis BigKey
- 网络管理软件,这个市场肉很多
- tensorflow安装中踩到的坑protobuf、h5py、tensorboard、werkzeug
- 在软件测试中UT,IT,ST,UAT分别是什么意思
- 历年研究生数学建模优秀论文汇总
- A股动量策略有效性验证
- Flutter(Dart)基础——函数详解
- 如何搭建一个简单的个人网站
- 上海七宝惊现海宝美眉
- Python采集手机4K壁纸,又是一个练手小案例,也不用担心没壁纸换咯
- 诺贝尔奖得主费曼大神教你如何学习
热门文章
- Realsense D455 修改分辨率和FPS
- 【ARC083E】Bichrome Tree
- mysql(指RDS)验证pureftpd登录
- 设计模式之设计原则(一)
- ThinkPHP5.0版本和ThinkPHP3.2版本的差别
- cefsharp作为采集工具(学习笔记)
- 在控制用' * '台画一个圆形图案
- matlab实现将彩色图像(R,G,B)色分量的直方图匹配,并计算其相关性
- 【Redis学习笔记】Redis初识
- 从零基础入门Tensorflow2.0 ----六、30 kaggle 10 monkeys 基础模型搭建与训练