2023年3月

1
传递依赖冲突解决(了解)

传递依赖:
A
(项目)依赖
B

B
依赖
C

1.1
版本),
B

A
的直接依赖,
C
就是
A
的传递依赖

导入依赖
D

D
依赖
C

1.2
版本)

1.1
M
aven
自己调解原则

1.1.1
第一声明者优先原则

谁先定义的就用谁的传递依赖。

1.1.2
路径近者优先原则

直接依赖级别高于传递依赖。

1.2
排除依赖

1.3
版本锁定(推荐使用)

====================dependencyManagement 是什么

Maven中的dependencyManagement 意义 - Mr_伍先生 - 博客园
http://www.cnblogs.com/mr-wuxiansheng/p/6189438.html

\01_springboot简介.avi;
\02_springBoot环境搭建.avi;
\03_springboot入门案例.avi;
\04_springboot整合Mybatis.avi;
\05_spirngBoot整合REDIS单机版.avi;
\06_springboot整合REDIS集群.avi;
\07_springboot的JD案例.avi;

一、用springboot向导创建:

填项目信息,勾选需要的功能,将具有的所有功能截图如下:,如果创建web 请勾选下方的 web选项。

springboot 项目结构如下:

二:用maven创建,pom.xml,手动创建两个文件夹,和一个properties文件

1、创建一个 main入口函数,手动写一个函数,添加注解。 光标放注解上方,按F2可以看到它具备有 的功能。

2、然后再手动添加 static  templates 两个文件夹,和 application.properties文件

3、pom.xml 里面添加springboot依赖,里面的 mybatis ,mysql,druid, 如果不用可以去掉

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath/> <!--lookup parent from repository-->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.7</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--加入redis起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.28</version>
        </dependency>

    </dependencies>

凡是以前要配置的先都不需要配置了,凡是以前不用配置的都使用约定的方式。

有个前提:

--  @RestController写在类上 代替 传统的 Controller,1、可以直接生产 有rest风格的 url



2、表示支持:@ResponseBody 返回Json格式, (返回的对象、集合列表都是 json格式)

====拓:

SpringBoot笔记一 - jsyxcjw的专栏 - CSDN博客
http://blog.csdn.net/jsyxcjw/article/details/46763639/

【详解】为什么选择Spring Boot作为微服务的入门级微框架-CSDN.NET---太高深看不到
http://www.csdn.net/article/a/2016-05-12/15838098

三、======整合mybatis框架

1、 pom 里面要导入 mybatis整合的jar包,写固定的配置文件

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>


2、写好Mapper两个(一个xml一个java),dao(domain),service两个就可以用了,配置文件里面是固定的。

加上Mapper注解,就可以代替以前的扫描了


其中的 sqlMapConfig.xml 里面是空的,但不确定是否一定要用到:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"
> <configuration> </configuration>

四、====整合redis单机版  ,作为缓存

好处:相同的不再查数据库,而是查redis的缓存


1、配置文件里面写端口登;pom里面添加 redis的 依赖坐标

<!--加入redis起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
        </dependency>

2、开启缓存,在程序入口处:

3、service实现类中写:

五、=====整合redis 集群

1、先启动多台redis服务器 7001 到7008 redis集群  cluster

配置:

2、配置文件里面的多个IP需要自己 解析出来:

@Configuration 把这个类变成一个配置文件,相当于以前的  applicationContext。xml

@Bean 在里面创建一个bean 相当于以前的配置 <bean>, 以后就可以在其他单元文件 使用这个bean了:用@Autowired

@Value 获取里面的配置文件的 内容,并且注入到 属性 clusterNodes 中;

3、使用:
serviceimpl
实现类中


service 中:

Controller中

总结:这样如果访问这个地址,就会先才集群里面存这个 内容;经过到服务器里面 看到存在 7003这个节点下面。但是:我还不知这个有什么用?

六、===== JD案例,实际是说加载静态资源,讲到 freemarker

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

将静态资源对号入座放到文件夹中,写个Controller 返回 页面 即可看到JD 的页面。


《别out了!还不知非关系型数据库----mongodb视频》

MongoDB教程  http://www.mongodb.org.cn/tutorial/

1、官网下载 对应的版本,  mongodb-win32-x86_64-2008plus-ssl-3.4.6-signed.msi

2、傻瓜式安装 。  本人安装在 D:\wamp\mongodb  安装好后,D:\wamp\mongodb\data\db 在里面建多两层文件夹


到bin目录下面 管理员权限运行cmd命令  mongod.exe --install --dbpath D:\wamp\mongodb\data\db --logpath D:\wamp\mongodb\data\log.txt


==》

3、启动

D:\wamp\mongodb\bin>net start mongodb
请求的服务已经启动。

4、链接数据库  D:\wamp\mongodb\bin>mongo 127.0.0.1:27017

5、查看数据库 > show databases 或  用 show dbs

基本操作命令

a
在线手册

http://www.runoob.com/mongodb/mongodb-tutorial.html

b
查看已有的数据库

语法
: show dbs
或者
show databaes(

mysql
一样
);

c
选择数据库

use
数据库名
(

mysql
一致
)

删除数据库

use
数据库

db.dropDatabase();

6
集合的操作

a
查看当前数据库已有的集合
(
相当于
mysql
的表
)

语法
: show collections(
推荐使用
)
或者
show tables(

mysql
的兼容
)

当使用这个命令时
,
要选择一个数据库

使用
mongodb
特有的命令

b
集合的创建

语法
:db.createCollection(
‘集合名’
);   #
注意集合这个单词的首字母大写

注意
:
如果
use
了一个不存在的数据库
,
我们依旧可以在里面创建集合
.


use
一个不存在的数据库时就会自动创建
.

c
集合
(

)
的删除

语法
:db.
集合名
.drop();


实现数据
(
文档
)

crud

1) C
数据的增加

语法
:db.
集合名
.insert(json
数据
);

json
数据
{

key1

:

value1

,

key2

:

value2

}

说明
:
插入记录成功之后
,mongodb
会默认为每一个文档都添加一个
_id
的字段
,
并且 同一集合中的
_id
是唯一的
.

思考
:
一次性插入多条数据
.

语法格式
:db.goods.insert([{},{},{}]);


js
中索引数组形式插入多条数据

2) R

语法
:db.
集合名
.find(
查询条件
,
查询的列
)


:db.goods.find()    #
查询集合中所有的记录

db.goods.find({

name

:

feng

})  #
查询集合中名字叫
feng
的记录

第一个参数查询条件相当于
MySQL
中的
where
条件

第二个参数查询列格式说明
:

{

age

:1}     #
表示仅返回年龄

db.goods.find({"name":"feng"},{"age":1});

{

age

:0}     #
返回除了年龄意外其他数据

db.goods.find({"name":"feng"},{"age":0});

{

age

:1,name

:1}  #
只返回年龄与姓名

3)R

语法
:db.
集合名
.remove(query,justOne);

参数说明
:query
查询表达式是一个
json
数据
(

sql
中的
where
相似
)


:
删除键名为’李世民’的数据
:db.test.remove({

name

:
”李世民”
});

justOne:true/false
是否只删除
1

.
默认为
false(
相当于
sql
中的
limit)

一次只删一条数据

一次性删除两条数据
,

remove
的第二个参数设置为
FALSE

4) U

语法
:db.
集合名
.update(
条件
,
数据
,[
是否新增默认
false],[
是否修改多条默认
false]).

参数说明
:

参数
3 :
修改的数据不存在则自动添加
,
默认
false,
不添加

参数
4:
是否修改所有符合条件的数据
,
默认值修改一条
.

a
创建测试数据

db.createCollection("test1");

for(var i = 1; i<= 10; i++){

db.test1.insert( {"name":"zs"+i,"age":i} );

}

实际的操作
:

b
修改器的使用


1:


{

name

:

zs1

}
修改为
{

name

:

zs2

}

问题
:
我们只想修改名字
.
但是年龄被删除了
.


2:

a
如何解决例
1
中的数据替换问题
?

办法
:
使用修改器
.

语法
:db.
集合名
.update({
条件
},{
修改器名称:{
修改的键
:
修改的值
}});


2:
通过修改器将
zs3
的年龄修改为
33

db.test1.update({

name

:

zs1

},{

$set

:{

age

:33}});

说明
:
修改器名称的引号可加可不加
,
在这里统一必须要加
.


2:

zs10
的年龄增加两岁
.

db.test1.update({

name

:

zs10

},{

$inc”
:{

age

,2}});

c
测试新增
(
第三个参数的使用
)

当我们再修改数据时
,
如果没有符合条件的
.
就直接新增加一条数据
.

d
测试一次修改多条
(
第四个参数的使用
)

如果一次性有多条数据满足要求
.
那么设为
TRUE

.
就全部修改


:

zs2

name
修改为
250

查询数据:

6、主从服务器,数据同步:


概念: 
----collection, BSON——binary json  启动:mongod -dbpath=/var/db --rest --auth &  --rest启动http api --auth启动包含用户认证(不加则不认证) 基本命令:  连接数据库mongo -uroot -proot admin  
show dbs 显示数据库名 
show collections 显示数据库中集合 
show users 吸纳时当前数据库 用户 
show profile 吸纳时最后系统用时
>1ms的概要 use 切换数据库(没有数据库时会先建立) 
db.help() db.test.help() 显示帮助,显示命令帮助。 
db.createCollection("
user");新建user 集合。 
db.
user.insert({uid:1,username:"jason.sz",age:30});插入一行数据 
db.user.find();查询数据 
db.
user.update({uid:1},{$set:{age:25}});更新数据 
db.dropDatabase() 删除库 需先use 到该数据库 权限管理: 
1,mongodb是没有默认管理员账号,要先添加管理员账号,在开启权限认证。 
2,切换到admin数据库,添加的账号才是管理员账号。 
3,用户只能在用户所在数据库登录,包括管理员账号。 

4,管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。 
安装完成时无用户,需要先添加添加管理员用户(不加
--auth启动)  use adimin 
db.addUser("root","root") 关键字写法记住是驼峰式 
db.addUser("test","test",true)建立只读用户 
验证用户db.auth("root","root")返回1 认证成功 
添加普通数据库用户 
用管理员帐号use test  db.addUser("test","
1234") 
数据导入导出: 
mongoexport 
-u test -p test -d test -user -user.dat 参数-d dbname -c collection 
name 
-o output location 还可以制定格式导出--cvs --jsonArray -f指定导入字段  mongodump -d test -/root/tmp 库表级备份 
mongorestore  访问控制: 
--bind_ip 192.168.1.1 只允许192.168.1.1访问 --port 制定端口 默认的是27017  设置权限 

Maven结构,一个父模块 六个子模块 七个pom.xml;

\git\renren-security\pom.xml


    <modules>
        <module>renren-common</module> <!--公共模块-->
        <module>renren-shiro</module> <!--权限系统模块-->
        <module>renren-schedule</module> <!--定时任务模块-->
        <module>renren-gen</module> <!--代码生成器模块-->
        <module>renren-api</module> <!--API模块-->
        <module>renren-web</module> <!--管理后台模块-->
    </modules>

<properties>
/

/定义各jar包的  版本号,被用来引用,


<properties>

    <properties>
        <renren-version>2.0.0</renren-version>
        <java-version>1.7</java-version>
        <servlet-version>3.1.0</servlet-version>
        <junit-version>4.12</junit-version>
        <springframework-version>4.3.7.RELEASE</springframework-version>
        <mybatis-version>3.4.1</mybatis-version>
        <mybatis-spring-version>1.3.0</mybatis-spring-version>
        <mysql-version>5.1.38</mysql-version>
        <hibernate-validator-version>5.4.1.Final</hibernate-validator-version>
        <druid-version>1.0.28</druid-version>
        <commons-lang-version>2.6</commons-lang-version>
        <commons-fileupload-version>1.3.1</commons-fileupload-version>
        <commons-io-version>2.5</commons-io-version>
        <commons-codec-version>1.10</commons-codec-version>
        <commons-configuration-version>1.10</commons-configuration-version>
        <slf4j-version>1.7.19</slf4j-version>
        <log4j-version>1.2.17</log4j-version>
        <fastjson-version>1.2.30</fastjson-version>
        <shiro-version>1.3.2</shiro-version>
        <kaptcha-version>0.0.9</kaptcha-version>
        <velocity-version>1.7</velocity-version>
        <velocity-tools-version>2.0</velocity-tools-version>
        <jstl-version>1.2</jstl-version>
        <taglibs-version>1.1.2</taglibs-version>
        <freemarker-version>2.3.23</freemarker-version>
    </properties>

排除传递依赖:
exclusions

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-tools</artifactId>
            <version>${velocity-tools-version}</version>
            <exclusions>
                <exclusion>//这里就是排除传递依赖<artifactId>dom4j</artifactId>
                    <groupId>dom4j</groupId>
                </exclusion>

git\renren-security\renren-web:

pom.xml:

上图说得很明白: 父模块,项目名称,打包方式war表面是一个web模块,依赖于5个子模块,为什么要定义build finalName  renren-security ??

/renren-web/src/main/resources/spring-mvc.xml

    <context:component-scanbase-package="io.renren" />//扫描包,有什么用不记得了??<context:annotation-config/>
    <mvc:default-servlet-handler/>
    <aop:aspectj-autoproxyproxy-target-class="true" />
    <mvc:annotation-driven>//注解驱动<mvc:message-convertersregister-defaults="true">
            <beanclass="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> //Json解析器

git/renren-security/renren-shiro/pom.xml

上面 说明了,父模块是谁,模块名称,打包方式,依赖哪个模块

/renren-shiro/src/main/resources/renren-shiro.xml

/renren-common/pom.xml


==》pom.xml

/renren-common/src/main/resources/mybatis.xml 里面只配置了 <setting name="mapUnderscoreToCamelCase" value="true" /> 不确定作用???

/renren-common/src/main/resources/spring-jdbc.xml 很多配置,里面很多都不确定作用?

    <beanid="druid-stat-pointcut"class="org.springframework.aop.support.JdkRegexpMethodPointcut"scope="prototype">
        <propertyname="patterns">
            <list>
                <value>io.renren.controller.*</value>
                <value>io.renren.service.*</value>
            </list>
        </property>
    </bean>
    <aop:config>
        <aop:advisoradvice-ref="druid-stat-interceptor"pointcut-ref="druid-stat-pointcut"/>
    </aop:config>
    <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <propertyname="basePackage"value="io.renren.dao" />
    </bean>

其它模块的配置文件 在此不说明了,

maven  shiro包的引用路径 :C:\Users\yanfazhongxin\.m2\repository\org\apache\shiro\shiro-core\1.3.2\shiro-core-1.3.2.jar

有关的几个文件:
/renren-shiro/src/main/resources/renren-shiro.xml //shiroFilter和 其它bean的配置
/renren-shiro/src/main/java/io/renren/shiro/UserRealm.java //继承于AuthorizingRealm 自定义Realm,认证 和 授权
/renren-shiro/src/main/java/io/renren/shiro/VelocityShiro.java//判断public boolean hasPermission(String permission)  是否有权限,一个方法。
/renren-shiro/src/main/java/io/renren/utils/ShiroUtils.java//Shiro工具类,getSession  getSubject  getKaptcha等操作

    <!--继承自AuthorizingRealm的自定义Realm,即指定Shiro验证用户登录的类为自定义的UserRealm.java-->  
    <beanid="userRealm"class="io.renren.shiro.UserRealm"/>

    <beanid="sessionManager"class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!--设置session过期时间为1小时(单位:毫秒),默认为30分钟-->
        <propertyname="globalSessionTimeout"value="3600000"></property>
        <propertyname="sessionValidationSchedulerEnabled"value="true"></property>
    </bean>
    
    <!--Shiro默认会使用Servlet容器的Session,可通过sessionMode属性来指定使用Shiro原生Session-->  
    <!--即<property name="sessionMode" value="native"/>,详细说明见官方文档-->  
    <!--这里主要是设置自定义的单Realm应用,若有多个Realm,可使用'realms'属性代替-->  
    <beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <propertyname="sessionManager"ref="sessionManager"></property>
        <propertyname="realm"ref="userRealm"/>
    </bean>

UserRealm 是一个自定义的可以用来判断:根据输入的用户名 查数据库得到密码 和输入的密码对比,相同,则表示 输入的用户名和密码通过,认证成功。

==拓展:课程里面的例子:

//自定义realm
@Testpublic voidtestCustomRealm() {//创建securityManager工厂,通过ini配置文件创建securityManager工厂
        Factory<SecurityManager> factory = newIniSecurityManagerFactory("classpath:shiro-realm.ini");//创建SecurityManager
        SecurityManager securityManager =factory.getInstance();//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);//从SecurityUtils里边创建一个subject
        Subject subject =SecurityUtils.getSubject();//在认证提交前准备token(令牌)//这里的账号和密码 将来是由用户输入进去
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","666666666666");try{//执行认证提交
subject.login(token);
}
catch(AuthenticationException e) {//TODO Auto-generated catch block e.printStackTrace();
}
//是否认证通过 boolean isAuthenticated =subject.isAuthenticated();

System.out.println(
"是否认证通过:" +isAuthenticated);

}
===== shiro-realm.ini文件
[main]
#自定义 realm
customRealm
=cn.itcast.shiro.realm.CustomRealm
#将realm设置到 securityManager,相当于spring中注入
securityManager.realms
=$customRealm

如果:不自定义 realm的话,只能从配置 ini里面读出[users] 段的用户名和密码,就不能用自定义的 realm 的逻辑来判断。

自定义realm要继承于 AuthorizingRealm  :  public class CustomRealm extends AuthorizingRealm {


packagecn.itcast.shiro.realm;importorg.apache.shiro.authc.AuthenticationException;importorg.apache.shiro.authc.AuthenticationInfo;importorg.apache.shiro.authc.AuthenticationToken;importorg.apache.shiro.authc.SimpleAuthenticationInfo;importorg.apache.shiro.authz.AuthorizationInfo;importorg.apache.shiro.realm.AuthorizingRealm;importorg.apache.shiro.subject.PrincipalCollection;/*** 
* <p>
* Title: CustomRealm
* </p>
* <p>
* Description:自定义realm
* </p>
* <p>
* Company: www.itcast.com
* </p>
*
*
@author传智.燕青
* @date 2015-3-23下午4:54:47
*
@version1.0*/ public class CustomRealm extendsAuthorizingRealm {//设置realm的名称 @Overridepublic voidsetName(String name) {super.setName("customRealm");
}
//用于认证 @OverrideprotectedAuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token)
throwsAuthenticationException {//token是用户输入的//第一步从token中取出身份信息 String userCode =(String) token.getPrincipal();//第二步:根据用户输入的userCode从数据库查询//....//如果查询不到返回null//数据库中用户账号是zhangsansan /*if(!userCode.equals("zhangsansan")){//
return null;
}
*/ //模拟从数据库查询到密码 String password = "666666112";//如果查询到返回认证信息AuthenticationInfo SimpleAuthenticationInfo simpleAuthenticationInfo= newSimpleAuthenticationInfo(
userCode, password,
this.getName());returnsimpleAuthenticationInfo;
}
//用于授权 @OverrideprotectedAuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
//TODO Auto-generated method stub return null;
}

}

CustomRealm

==========
拓展如果要MD5 加盐 来加密(散列)密码

MD5 加盐  import org.apache.shiro.crypto.hash.Md5Hash;

Md5Hash md5Hash = new Md5Hash(userId, "fda45fda", 2); //new Md5Hash(source, salt, hashIterations)
md5Hash.toString();

通过 ini配置 注入bean(通过spring要百度学习),和定义自定义的 realm

注解 @RequiresPermissions("sys:menu:select")  原来是 shiro的东西,要求必须具备sys:menu:select 权限的才可以往下执行。