SpringBoot注解相关从入门到入门

SpringSecurity详解

  • 导入SpringSecurity依赖
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
  • 自定义类SecurityConfig,继承WebSecurityConfigurerAdapter
  • 添加注释@EnableWebSecurity 重写对应方法
package com.zhou.springbootsecurity.config;


import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;


//AOP  类似于拦截器
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

//链式编程
    @Override
    protected void configure(HttpSecurity http) throws Exception {
//首页所有人能访问 但是功能页面只有有对应权限的人才能访问

//        403 权限不允许
//        请求授权的规则
        http.authorizeRequests().
                antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

//        没有权限默认回到登录页面
        http.formLogin();
    }



//    认证

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

//        从内存中读 来匹配用户名和密码  当然也可以从数据库中读
//        PasswordEncoder密码编码错误   也就是需要加密
       auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
               .withUser("zhou").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
               .and().withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
                .and()
               .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
}

SpringBoot特点

1 依赖管理

  • 父项目做依赖管理
<!--  1.引入父子工程-->
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.3.12.RELEASE</version>
   </parent>

上面的父项目

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.12.RELEASE</version>
  </parent>

在这里插入图片描述
几乎声明了开发中所有依赖包的版本号

  • 开发导入starter场景启动器即可
    spring-boot-starter-* *代表某种场景
    只要引入了starter,这个场景的所有常规需要的依赖我们都自动引入
    thirdpartyproject-spring-boot-starter.还可以自定义第3方 的starter
    在这里插入图片描述
  • 可以自动版本仲裁 当然也可以修改版本号
    在pom.xml中增加配置
    <properties>
        <mysql.version>5.1.43</mysql.version>
    </properties>

2 自动配置

  • 自动配置好tomcat
    引入tomcat包 配置tomcat
  • 自动配好springMVC的全套组件、web常见功能
    在这里插入图片描述
package com.zhou.boot;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


/*

主程序类
* @SpringBootApplication告诉它这个是一个SpringBoot应用
* */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
//返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

//    常看容器里面的组件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (int i = 0; i < beanDefinitionNames.length; i++) {
            System.out.println(beanDefinitionNames[i]);
        }
    }
}

  • 默认的包结构
    主程序所在的包及其下面的所有子包里面的组件都会默认扫描,无需配置以前的包扫描
    org.springframework.boot
    spring-boot-autoconfigure
    2.3.12.RELEASE
    按需加载配置,有关配置功能的包在spring-boot-autoconfigure里面

底层注解@Configuration详解

作用

  • 告诉springboot这是一个配置类 约等于以前的bean.xml,在里面可创建对象
package com.zhou.boot.config;


import com.zhou.boot.pojo.Pet;
import com.zhou.boot.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //告诉springboot 这是一个配置类 ==beans.xml配置文件

public class MyConfig {

    @Bean //给容器添加组件  方法名就是组件id,返回类型就是组件类型  返回的值就是组件在容器中的实例
    public User user01(){
        return new User("zhangsan",12);
    }

    @Bean("zhoudage")//自定义id号   取代了cat这个名字
    public Pet cat(){
        return new Pet("tomcat");
    }
}

  • 配置类中使用@Bean标注在方法上给容器注册组件,默认是单实例
package com.zhou.boot;


import com.zhou.boot.pojo.Pet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


/*

主程序类
* @SpringBootApplication告诉它这个是一个SpringBoot应用
* */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
//返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

/*//    常看容器里面的组件
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (int i = 0; i < beanDefinitionNames.length; i++) {
            System.out.println(beanDefinitionNames[i]);
        }*/

//        从容器中获取组件
        Pet z1 = run.getBean("zhoudage", Pet.class);
        Pet z2 = run.getBean("zhoudage", Pet.class);
        System.out.println(z1.hashCode()+"  "+z2.hashCode());
//        -868129409  -868129409 hashCode值一样

    }
}
  • 配置类本身也是组件 要用类模板对象获得
        MyConfig myConfig = run.getBean(MyConfig.class);
        System.out.println(myConfig);
//com.zhou.boot.config.MyConfig$$EnhancerBySpringCGLIB$$d6a490a2@15fc442
  • @Configuration(proxyBeanMethods = true) 代理bean的方法,外部无论对配置类中这个组件祖册方法调用多少次获取的都是之前注册容器中的单实例方法
        MyConfig myConfig = run.getBean(MyConfig.class);
        System.out.println(myConfig);
//com.zhou.boot.config.MyConfig$$EnhancerBySpringCGLIB$$d6a490a2@15fc442
        Pet c1 = myConfig.cat();
        Pet c2  = myConfig.cat();
        System.out.println(c1.hashCode()+" "+c2.hashCode());

//        -868129409 -868129409

改为false之后就不是单实例了,默认为true

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入
在这里插入图片描述
在这里插入图片描述

ImportResource导入原来的spring配置文件

@ImportResource(“classpath:beans.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 实体类的名字     类所在的包-->
    <bean id="zhang" class="com.zhou.boot.pojo.User">
        <property name="name" value="zhangsan" ></property>
        <property name="age" value="12"></property>
    </bean>

    <bean id ="li" class="com.zhou.boot.pojo.Pet">
        <property name="name" value="tomcat">
        </property>
    </bean>
</beans>

在这里插入图片描述

如何将properties配置文件中类的属性值整合放到IOC容器中

在这里插入图片描述
在这里插入图片描述

package com.zhou.boot.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.ImportResource;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
//只有在容器中的组件才能有spring提供的强大功能
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
    private String name;
    private int price;
}
@RestController
public class HelloController {


//    从容器中自动获得
    @Autowired
    Car car;

    @RequestMapping("/car")
    public Car getCar(){
        return car;
    }

上面的@Component功能和
@EnableConfigurationProperties(Car.class)
//开启Car配置绑定功能
功能相似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值