首页 / 程序员 / 正文
加强版《Spring 学习笔记》真心不错
付东 发表于:2020-3-25 12:58:35 复制链接 看图 发表新帖
阅读数:25759

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
增强版《Spring 进修笔记》至心不错-1.jpg

本文提醒:好记忆不如烂笔头, 能记下点什么, 就记下点什么, 方便前期的稳固

Spring先容

Spring 是一个开源框架,是一个分层的 JavaEE 一站式框架。

所谓一站式框架是指 Spring 有 JavaEE 开辟的每一层处理计划。
    WEB层:SpringMVCService层:Spring的Bean治理,声明式事务DAO层:Spring的JDBC模板,ORM模板

优点:
    IOC:方便解耦合AOP:对法式停止扩大轻量级框架方便与其他框架整合

Spring利用

Spring开辟包解压后的目录先容:
    docs: Spring 开辟标准和APIlibs: Spring jar 包和源代码schema: Spring 设置文件的约束

增强版《Spring 进修笔记》至心不错-2.jpg

DataAccess 用于数据拜候,WEB 用于页面显现,焦点容器也就是IOC部分。

控制反转(IOC)

控制反转(Inversion of Control)是指将工具的建立权反转(交给)Spring。

利用IOC就需要导入IOC相关的包,也就是上图中焦点容器中的几个包:beans,context,core,expression四个包。

实现道理

传统方式建立工具:

UserDAO userDAO=new UserDAO();

进一步面向接口编程,可以多态:

UserDAO userDAO=new UserDAOImpl();

这类方式的弱点是接口和实现类高耦合,切换底层实现类时,需要点窜源代码。法式设想应当满足OCP元祖,在只管不点窜法式源代码的根本上对法式停止扩大。此时,可以利用工场形式:

class BeanFactory{

public static UserDAO getUserDAO(){

return new UserDAOImpl();

}

}

此种方式虽然在接口和实现类之间没有耦合,可是接口和工场之间存在耦合。

利用工场+反射+设置文件的方式,实现解耦,这也是 Spring 框架 IOC 的底层实现。

//xml设置文件

//

class BeanFactory{

public static Object getBean(String id){

//剖析XML

//反射

Class clazz=Class.forName();

return clazz.newInstance();

}

}

IOC XML 开辟

在 docs 文件中包括了 xsd-configuration.hmtl 文件。其中界说了 beans schema。



//在此设置bean







挪用类:

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

UserService userService=(UserService)applicationContext.getBean("userService");

userService.save();

IOC 和 DI

DI 指依靠注入,其条件是必须有 IOC 的情况,Spring 治理这个类的时辰将类的依靠的属性注入进来。

例如,在UserServiceImpl.java中:

public class UserServiceImpl implements UserService{

private String name;

public void setName(String name){

this.name=name;

}

public void save(){

System.out.println("save "+name);

}

}

在设置文件中:













测试代码:

@Test

public void demo2(){

//建立Spring工场

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

UserService userService=(UserService)applicationContext.getBean("userService");

userService.save();

}

运转成果:

save tony

可以看到,在设置文件中设置的属性,在 Spring 治理该类的时辰将其依靠的属性成功停止了设备。假如不利用依靠注入,则没法利用接口,只能利用实现类来停止设备,由于接口中没有该属性。

Spring 的工场类
    BeanFactory: 老版本的工场类,在挪用getBean()方式时,才会天生类的实例。ApplicationContext: 在加载设置文件的时辰,就会将 Spring 治理的类都实例化。有两个实现类:

  • ClassPathXmlApplicationContext: 加载类途径下的设置文件
  • FileSystemXmlApplicationContext: 加载磁盘下的设置文件

bean标签设置
    id: 唯一约束,不能出现特别字符name: 理论上可以反复,可是开辟中最好不要。可以出现特别字符

生命周期:
    init-method: bean被初始化的时辰履行的方式destroy-method: bean被烧毁的时辰履行的方式

感化范围:
    scope: bean的感化范围,有以下几种,常用的是前两种
  • singleton: 默许利用单例形式建立
  • prototype: 多例
  • request: 在web项目中,spring 建立类后,将其存入到 request 范围中
  • session: 在web项目中,spring 建立类后,将其存入到 session 范围中
  • globalsession: 在web项目中,必须用在 porlet 情况

属性注入设备
    机关方式方式的属性注入: Car 类在机关方式中有两个属性,别离为 name 和 price。








    set 方式属性注入: Employee 类在有两个 set 方式,别离设备普通范例的 name 和援用范例的 Car (利用 ref 指向援用范例的 id 或 name)。








    P称号空间的属性注入: 首先需要引入p称号空间:





假如是普通属性:





假如是援用范例:




    SpEL(Spring Expression Language)属性注入(Spring 3.x以上版本)








    调集范例属性注入:







qirui

baoma

benchi







多模块开辟设置
    在加载设置文件的时辰,加载多个设置文件在一个设置文件中引入多个设置文件,经过实现

IOC 注解开辟

示例
    引入jar包: 除了要引入上述的四个包之外,还需要引入aop包。建立 applicationContext.xml ,利用注解开辟引入 context 约束(xsd-configuration.html)






    组件扫描: 利用IOC注解开辟,需要设置组件扫描,也就是哪些包下的类利用IOC的注解。


    在类上增加注解利用注解设备属性的值

属性倘使有set方式,将属性注入的注解增加到set方式

属性没有set方式,将注解增加到属性上。

@Component("UserDao")//相当于设置了一个 其id为UserDao,对应的类为该类

public class UserDAOImpl implements UserDAO {

@Override

public void save() {

// TODO Auto-generated method stub

System.out.println("save");

}

}

注解详解
    @Component

组件注解,用于修饰一个类,将这个类交给 Spring 治理。

有三个衍生的注解,功用类似,也用来修饰类。
    @Controller:修饰 web 层类@Service:修饰 service 层类@Repository:修饰 dao 层类

2.属性注入
    普通属性利用 @Value 来设备属性的值工具属性利用 @Autowired ,这个注解是依照范例来停止属性注入的。假如希望依照 bean 的称号或id停止属性注入,需要用 @Autowired 和 @Qualifier 一路利用现实开辟中,利用 @Resource(name=" ") 来停止依照工具的称号完成属性注入

3.其他注解
    @PostConstruct 相当于 init-method,用于初始化函数的注解@PreDestroy 相当于 destroy-method,用于烧毁函数的注解@Scope 感化范围的注解,常用的是默许单例,还有多例 @Scope("prototype")

IOC 的 XML 和注解开辟比力
    适用处景:XML 适用于任何场景;注解只合适自己写的类,不是自己供给的类没法增加注解。可以利用 XML 治理 bean,利用注解来停止属性注入

AOP开辟

AOP 是 Aspect Oriented Programming 的缩写,意为面向切面编程,经过预编译方式和运转期静态代理实现法式功用的同一保护的一种技术,是OOP的延续。

AOP 可以对法式停止增强,在不点窜源码的情况下,可以停止权限校验,日志记录,性能监控,事务控制等。

也就是说功用分为两大类,一类是焦点营业功用,一类是帮助增强功用。两类功用相互自力停止开辟。比如登录功用是焦点营业功用,日志功用是帮助增强功用,倘使有需要,将日志和登录编制在一路。帮助功用就称为切面,这类能挑选性的、低耦合的把切面和焦点营业功用连系的编程思惟称为切面编程。

底层实现

JDK 静态代理只能对实现了接口的类发生代理。Cglib 静态代理可以对没有实现接口的类发生代理工具,天生的是子类工具。

利用 JDK 静态代理:

public interface UserDao {

public void insert();

public void delete();

public void update();

public void query();

}

实现类:

public class UserDaoImpl implements UserDao { @Override public void insert() { System.out.println("insert"); } @Override public void delete() { System.out.println("delete"); } @Override public void update() { System.out.println("update"); } @Override public void query() { System.out.println("query"); } }

JDK 代理:

public class JDKProxy implements InvocationHandler{

private UserDao userDao;

public JDKProxy(UserDao userDao){

this.userDao=userDao;

}

public UserDao createProxy(){

UserDao userDaoProxy=(UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),

userDao.getClass().getInterfaces(), this);

return userDaoProxy;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

if("update".equals(method.getName())){

System.out.println("权限校验");

return method.invoke(userDao, args);

}

return method.invoke(userDao, args);

}

}

经过静态代理增强了 update 函数。 测试类:

public class Demo1 {

@Test

public void demo1(){

UserDao userDao=new UserDaoImpl();

UserDao proxy=new JDKProxy(userDao).createProxy();

proxy.insert();

proxy.delete();

proxy.update();

proxy.query();

}

}

运转成果为:

insert

delete

权限校验

update

query

CglibCglib 是第三方开源代码天生类库,可以静态增加类的属性和方式。

与上边JDK代理分歧,Cglib的利用方式以下:

public class CglibProxy implements MethodInterceptor{

//传入增强的工具

private UserDao customerDao;

public CglibProxy(UserDao userDao){

this.userDao=userDao;

}

public UserDao createProxy(){

Enhancer enhancer=new Enhancer();

enhancer.setSuperclass(userDao.getClass());

enhancer.setCallback(this);

UserDao proxy=(UserDao)enhancer.create();

return proxy;

}

@Override

public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {

if("save".equals(method.getName())){

System.out.println("enhance function");

return methodProxy.invokeSuper(proxy, args);

}

return methodProxy.invokeSuper(proxy, args);

}

}

假照实现了接口的类,底层采用JDK代理。假如不是实现了接口的类,底层采用 Cglib代理。

IOC与传统方式的比力
    获得工具方式:传统经过 new 关键字自动建立一个工具。IOC 方式中,将工具的生命周期交给 Spring 治理,间接从 Spring 获得工具。也就是控制反转————将控制权从自己手中交到了 Spring 手中。

Spring 的 AOP 开辟(AspectJ 的 XML 方式)

AspectJ 是一个 AOP 的框架,Spring 引入 AspectJ,基于 AspectJ 停止 AOP 的开辟。

相关术语
    Joinpoint: 毗连点,可以被阻挡到的点。也就是可以被增强的方式都是毗连点。Pointcut: 切入点,真正被阻挡到的点,也就是真正被增强的方式Advice: 告诉,方式层面的增强。对某个方式停止增强的方式,比如对 save 方式停止权限校验,权限校验的方式称为告诉。Introduction: 引介,类层面的增强。Target: 方针,被增强的工具(类)。Weaving: 织入,将 advice 利用到 target 的进程。Proxy: 代理工具,被增强的工具。Aspect: 切面,多个告诉和多个切入点的组合。

利用方式
    引入相关包引入设置文件






    编写方针类并设置:

public class ProductDaoImpl implements ProductDao {

@Override

public void save() {

System.out.println("save");

}

@Override

public void update() {

System.out.println("update");

}

@Override

public void find() {

System.out.println("find");

}

@Override

public void delete() {

System.out.println("delete");

}

}


    编写切面类,假定用于权限考证并设置

public class MyAspectXML {

public void checkPri(){

System.out.println("check auth");

}

}


    经过AOP设置完成对方针类的增强













告诉范例
    前置告诉:在方针方式履行前操纵,可以获得切入点信息



public void checkPri(JoinPoint joinPoint){

System.out.println("check auth "+joinPoint);

}
    后置告诉:在方针方式履行后操纵,可以获得方式返回值



public void writeLog(Object result){

System.out.println("writeLog "+result);

}
    环抱告诉:在方针方式履行前和后操纵,可以阻止方针方式执



public Object around(ProceedingJoinPoint joinPoint) throws Throwable{

System.out.println("before");

Object result=joinPoint.proceed();

System.out.println("after");

return result;

}
    异常抛出告诉:法式出现异常时操纵



public void afterThrowing(Throwable ex){

System.out.println("exception "+ex.getMessage());

}
    终极告诉:相当于finally块,不管代码能否有异常,城市履行



public void finallyFunc(){

System.out.println("finally");

}
    引介告诉:不常用

Spring 切入点表达式

基于 execution 函数完成

语法:[拜候修饰符] 方式返回值 包名.类名.方式名(参数)

其中肆意字段可以利用*取代暗示肆意值

Spring 的 AOP 基于 AspectJ 注解开辟

开辟步调
    引入jar包设备设置文件:






    编写设置方针类



public class OrderDao {

public void save(){

System.out.println("save order");

}

public void update(){

System.out.println("update order");

}

public void delete(){

System.out.println("delete order");

}

public void find(){

System.out.println("find order");

}

}
    开启aop注解自动代理


    编写切面类并设置

@Aspect

public class MyAspectAnno {

@Before(value="execution(* demo1.OrderDao.save(..))")

public void before(){

System.out.println("before");

}

}



注解告诉范例
    @Before: 前置告诉@AfterReturning: 后置告诉

@AfterReturning(value="execution(* demo1.OrderDao.save(..))",returning="result")

public void after(Object result){

System.out.println("after "+result);

}
    @Around:环抱告诉

@Around(value="execution(* demo1.OrderDao.save(..))")

public Object around(ProceedingJoinPoint joinPoint) throws Throwable{

System.out.println("before");

Object obj=joinPoint.proceed();

System.out.println("after");

return obj;

}
    @AfterThrowing: 抛出异常

@AfterThrowing(value="execution(* demo1.OrderDao.save(..))",throwing="e")

public void afterThrowing(Throwable e){

System.out.println("exception:"+e.getMessage();

}
    @After: 终极告诉

@After(value="execution(* demo1.OrderDao.save(..))")

public void after(){

System.out.println("finally");

}
    @PointCut:切入点注解

@PointCut(value="execution(* demo1.OrderDao.save(..))")

private void pointcut1(){}

此时,在上述告诉的注解中,value可以替换为该函数名,例如:

@After(value="MyAspect.pointcut1()")

public void after(){

System.out.println("finally");

}

这个注解的益处是,只需要保护切入点即可,不用在点窜时点窜每个注解。

Spring 的 JDBC 模板

Spring 对持久层也供给领会决计划,也就是 ORM 模块和 JDBC 的模板。针对 JDBC ,供给了 org.springframework.jdbc.core.JdbcTemplate 作为模板类。

利用 JDBC 模板
    引入jar包,数据库驱动,Spring 的 jdbc 相关包。根基利用:

public void demo1(){

//建立毗连池

DriverManagerDataSource dataSource=new DriverManagerDataSource();

dataSource.setDriverClassName("com.mysql.jdbc.Driver");

dataSource.setUrl("jdbc:mysql:///spring4");

dataSource.setUsername("root");

dataSource.setPassword("123456");

//建立JDBC模板

JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

jdbcTemplate.update("insert into account values (null,?,?)", "xiaoming",1000d);

}
    将毗连池和模板交给 Spring 治理

    设置文件:


















    测试文件:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

public class JdbcDemo2 {

@Resource(name="jdbcTemplate")

private JdbcTemplate jdbcTemplate;

@Test

public void demo2(){

jdbcTemplate.update("insert into account values (null,?,?)", "xiaolan",1000d);

}

}

利用开源数据库毗连池
    利用 DBCP 的设置:










    利用 C3P0 的设置:












    引入内部下性文件

首先建立内部下性文件:

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://192.168.66.128/spring4

jdbc.username=root

jdbc.password=123456

然后对属性文件停止设置:















CRUD操纵

insert, update, delete 语句都借助模板的 update 方式停止操纵。

public void demo(){

jdbcTemplate.update("insert into account values (null,?,?)", "xiaoda",1000d);

jdbcTemplate.update("update account set name=?,money=? where id=?", "xiaoda",1000d,2);

jdbcTemplate.update("delete from account where id=?", 6);

}

查询操纵:

public void demo3(){

String name=jdbcTemplate.queryForObject("select name from account where id=?",String.class,5);

long count=jdbcTemplate.queryForObject("select count(*) from account",Long.class);

}

将返回的成果封装成为类:

public void demo4(){

Account account=jdbcTemplate.queryForObject("select * from account where id=?", new MyRowMapper(),5);

}

其中:

class MyRowMapper implements RowMapper{

@Override

public Account mapRow(ResultSet rs, int rowNum) throws SQLException {

Account account=new Account();

account.setId(rs.getInt("id"));

account.setName(rs.getString("name"));

account.setMoney(rs.getDouble("money"));

return account;

}

}

Spring的事务治理

事务

事务是指逻辑上的一组操纵,组成这组操纵的各个单元,要末全数成功,要末全数失利。

具有四个特征:
    原子性:事务不成份分歧性:事务履行前后数据完整性连结分歧隔离性:一个事务的履行不应当遭到其他事务干扰持久性:一旦事务竣事,数据就持久化到数据库

假如不斟酌隔离性会激发平安性题目:
    读题目:
  • 脏读:一个事务读到另一个事务未提交的数据
  • 不成反复读:一个事务读到另一个事务已经提交的 update 数据,致使一个事务中屡次查询成果纷歧致
  • 幻读:一个事务读到另一个事务已经提交的 insert 数据,致使一个事务中屡次查询成果纷歧致写题目:
  • 丧失更新

处理读题目:设备事务隔离级别
    Read uncommitted: 未提交读,没法处理任何读题目Read committed: 已提交读,处理脏读题目Repeatable read: 反复读,处理脏读和不成反复读题目Serializable:序列化,处理一切读题目

事务治理API
    PlatformTransactionManager: 平台事务治理器

这是一个接口,具有多个分歧的实现类,如 DataSourceTransactionManager 底层利用了JDBC 治理事务; HibernateTransactionManager 底层利用了 Hibernate 治理事务。
    TransactionDefinition: 事务界说信息

用于界说事务的相关信息,如隔离级别、超时信息、传布行为、能否只读等
    TransactionStatus: 事务的状态

用于记录在事务治理进程中,事务的状态的工具。

上述API的关系: Spring 在停止事务治理的时辰,首先平台事务治理器按照事务界说信息停止事务治理,在事务治理进程傍边,发生各类此状态,将这些状态信息记录到事务状态的工具傍边。

事务的传布行为

事务的传布行为首要处理营业层(Service)方式相互挪用的题目,也就是分歧的营业中存在分歧的事务时,若何操纵。

Spring 中供给了7种事务的传布行为,分为三类:
    保证多个操纵在同一个事务中
  • PROPAGATION_REQUIRED: B方式挪用A方式,假如A中有事务,利用A中的事务并将B中的操纵包括到该事务中;否则新建一个事务,将A和B中的操纵包括进来。(默许)
  • PROPAGATION_SUPPORTS:假如A中有事务,利用A的事务;否则不利用事务
  • PROPAGATION_MANDATORY:假如A中有事务,利用A的事务;否则抛出异常保证多个操纵不在同一个事务中
  • PROPAGATION_REQUIRES_NEW:假如A中有事务,将其挂起,建立新事务,只包括本身操纵。否则,新建一个事务,只包括本身操纵。
  • PROPAGATION_NOT_SUPPORTED:假如A中有事务,挂起,不利用事务。
  • PROPAGATION_NEVER:假如A中有事务,抛出异常,也即不能用事务运转。嵌套事务
  • PROPAGATION_NESTED:假如A有事务,依照A的事务履行,履行完成后,设备一个保存点,然后履行B的操纵。假如出现异常,可以回滚到最初状态或保存点状态。

实例

以转账为例,营业层的DAO层类以下:

public interface AccountDao {

public void outMoney(String from,Double money);

public void inMoney(String to,Double money);

}

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{

@Override

public void outMoney(String from, Double money) {

this.getJdbcTemplate().update("update account set money = money - ? where name = ?",money,from);

}

@Override

public void inMoney(String to, Double money) {

this.getJdbcTemplate().update("update account set money = money + ? where name = ?",money,to);

}

}

public interface AccountService {

public void transfer(String from,String to,Double money);

}

public class AccountServiceImpl implements AccountService {

private AccountDao accountDao;

public void setAccountDao(AccountDao accountDao) {

this.accountDao = accountDao;

}

@Override

public void transfer(String from, String to, Double money) {

accountDao.outMoney(from, money);

accountDao.inMoney(to, money);

}

}

在xml中停止类的设置:













事务治理1: 编程式事务治理
    设置平台事务治理器






    设置事务治理模板类






    在营业层注入事务治理模板








    编码实现事务治理

//ServiceImpl类中:

private TransactionTemplate transactionTemplate;

@Override

public void transfer(String from, String to, Double money) {

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

@Override

protected void doInTransactionWithoutResult(TransactionStatus arg0) {

accountDao.outMoney(from, money);

accountDao.inMoney(to, money);

}

});

}

声明式事务治理(设置实现,基于AOP思惟)
    XML 方式的声明式事务治理

    设置事务治理器






    设置事务告诉










    设置aop事务








    注解方式

    设置事务治理器,和上方分歧开启事务治理的注解:


    在利用事务的类上增加一个注解@Transactional

这里有一份(高并发+Spring源码+JVM道了剖析+散布式架构+微办事架构+多线程并发道理等...这些成为架构师必备的内容)以及Java进阶进修线路图,相信你支付后进修 会有提升和收获。

支付方式:关注+转发,然后私信关键词 【 架构 】,即可获得。

增强版《Spring 进修笔记》至心不错-3.jpg


上一篇:游戏开辟通用技术和工具
下一篇:「译」 Gulp 4.0 API 文档
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#加强, #学习笔记, #真心, #不错
20 条评论
您需要登录后才可以回帖 登录 | 立即注册
Sophia148 发表于 2020-3-25 13:03:08 | 阅读全部
好东东
使用道具 举报
回复
小烛哥小q 发表于 2020-3-25 13:10:05 | 阅读全部
转发了
使用道具 举报
回复
从不再来考来b 发表于 2020-3-25 13:16:50 | 阅读全部
转发了
使用道具 举报
回复
123465617 发表于 2020-3-25 13:20:16 | 阅读全部
转发了
使用道具 举报
回复
ValerieW 发表于 2020-3-25 13:22:27 | 阅读全部
转发了
使用道具 举报
回复
鹰眼米霍克 发表于 2020-3-25 13:24:29 | 阅读全部
转发了
使用道具 举报
回复
kfyk929147 发表于 2020-3-25 13:29:18 | 阅读全部
转发了
使用道具 举报
回复
jttyn521 发表于 2020-3-25 13:32:51 | 阅读全部
转发了
使用道具 举报
回复
付东 发表于 2020-3-25 13:38:06 | 阅读全部
转发了
使用道具 举报
回复
一个人发神经经p 发表于 2020-3-25 13:43:39 | 阅读全部
转发了
使用道具 举报
回复
灰灰_hui 发表于 2020-3-25 13:45:23 | 阅读全部
转发了
使用道具 举报
回复
守望树匪 发表于 2020-3-25 13:50:20 | 阅读全部
转发了
使用道具 举报
回复
班冲 发表于 2020-3-25 13:52:22 | 阅读全部
转发了
使用道具 举报
回复
123465597 发表于 2020-3-25 13:55:08 | 阅读全部
转发了
使用道具 举报
回复
敷衍灬敷w 发表于 2020-3-25 13:56:24 | 阅读全部
转发了
使用道具 举报
回复
86559 发表于 2020-3-25 13:59:31 | 阅读全部
转发了
使用道具 举报
回复
糯米糕2017 发表于 2020-3-25 14:05:32 | 阅读全部
转发了
使用道具 举报
回复
遇惜知惜惜v 发表于 2020-3-25 14:07:18 | 阅读全部
转发了
使用道具 举报
回复
天空小宝宝挠 发表于 2020-3-25 14:13:15 | 阅读全部
转发了
使用道具 举报
回复
司必进反卖 发表于 2020-3-25 14:18:01 | 阅读全部
转发了
使用道具 举报
回复
相关推荐
广告合作以及侵权投诉客服QQ:1623331347 江苏好向圈信息科技有限公司 网站地图1 网站地图2