spring 配置 注入
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于spring 配置 注入内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在spring 配置 注入相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
spring 配置 注入相关知识
-
专题二:Bean(注解配置)---- Spring入门专题二:Bean(注解配置)---- Spring入门 Bean 定义及作用域的注解实现 Classpath 扫描与组件管理 类的自动检测与注册 Bean <context: annotation-config/> @Component, @Repository, @Service, @Controller Autowired 注解说明 @Required @Autowired @Qualifier @Resource 基于 Java 的容器注解说明 Spring 对 JSR 支持的说明 <!--more--> Bean 定义及作用域的注解实现 Classpath 扫描与组件管理 Spring3.0 开始,可以使用 Java 定义 Bean (以前使用XML
-
Spring注解配置和xml配置优缺点比较Spring注解配置和xml配置优缺点比较编辑在昨天发布的文章《spring boot基于注解方式配置datasource》一文中凯哥简单的对xml配置和注解配置进行了比较。然后朋友看到文章后,就问:那你说说这两种区别。编辑额,说真的,还真把凯哥给问蒙圈了。本文来源:凯哥Java【kaigejava】凯哥当时就回答:注解的方便。如果再深入呢?还真说不明白。是啊,现在都在说注解好,但是注解和xml比较起来有哪些优点呢?xml又为什么不好呢?有没有深入思考过么?以下内容是凯哥从网上找的并加以理解的。想要弄清楚这个,我们先来看看Xml.就目前Java web 开发应用中都能见到用xml作为配置的身影。在常用的框架中如:struts、spring mvc、hibernate、mybites等这些框架中(早期版本表现更为突出)都有xml配置。我们就来看看XML的优点:Xml优点1:xml是集中式的元数据,不需要和代码绑定的;在我们开发中,xml配置文件和代码类是区分开的。不需要绑定到代码中2:使用xml配置可以让软件
-
结合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 在使用spring框架的项目中,@Value是经常使用的注解之一。其功能是将与配置文件中的键对应的值分配给其带注解的属性。在日常使用中,我们常用的功能相对简单。本文使您系统地了解@Value的用法。 @Value注入形式 根据注入的内容来源,@ Value属性注入功能可以分为两种:通过配置文件进行属性注入和通过非配置文件进行属性注入。 非配置文件注入
-
Spring boot 基于注解方式配置datasourceSpring boot 基于注解方式配置datasource编辑Xml配置我们先来回顾下,使用xml配置数据源。步骤:先加载数据库相关配置文件;配置数据源;配置sqlSessionFactory,注入数据源具体如下:一:设置数据配置信息文件先在spring的配置文件中,加载数据库配置文件编辑<!-- 读取参数配置 --><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:dbconfig.properties</value><value>classpath:redis.properties<
spring 配置 注入相关课程
spring 配置 注入相关教程
- 6. 配置项自动注入对象 如果参数很多,一一指定对象属性和配置项的关联非常麻烦。可以通过设定对象与配置项的对应关系,来实现配置项的自动注入。实例:@Component // 注册为组件@EnableConfigurationProperties // 启用配置自动注入功能@ConfigurationProperties(prefix = "wxmp") // 指定类对应的配置项前缀public class WxMpParam { private String appid;// 对应到wxmp.appid private String secret; // 对应到wxmp.secret //省略 get set}在上面的代码中,通过 prefix = "wxmp" 指定了关联配置的前缀,属性 appid 即关联到前缀 + 属性名为 wxmp.appid 的配置项。同理,属性 secret 关联到 wxmp.secret 配置项。
- 4.7 开发 Spring Security 配置类 现在,我们就需要将用户、权限等信息通过配置类告知 Spring Security 了。4.7.1 定义配置类定义 Spring Security 配置类,通过注解 @EnableWebSecurity 开启安全管理功能。实例:@Configuration@EnableWebSecurity // 开启安全管理public class SecurityConfig { @Autowired private SecurityService securityService;}4.7.2 注册密码加密组件Spring Security 提供了很多种密码加密组件,我们使用官方推荐的 BCryptPasswordEncoder ,直接注册为 Bean 即可。我们之前在数据库中预定义的密码字符串即为 123 加密后的结果。 Spring Security 在验证密码时,会自动调用注册的加密组件,将用户输入的密码加密后再与数据库密码比对。实例: @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } public static void main(String[] args) { //输出 $2a$10$kLQpA8S1z0KdgR3Cr6jJJ.R.QsIT7nrCdAfsF4Of84ZBX2lvgtbE. System.out.println(new BCryptPasswordEncoder().encode("123")); }4.7.3 将用户密码及权限告知 Spring Security通过注册 UserDetailsService 类型的组件,组件中设置用户密码及权限信息即可。实例: @Bean public UserDetailsService userDetailsService() { return username -> { List<UserDo> users = securityService.getUserByUsername(username); if (users == null || users.size() == 0) { throw new UsernameNotFoundException("用户名错误"); } String password = users.get(0).getPassword(); List<String> apis = securityService.getApisByUsername(username); // 将用户名username、密码password、对应权限列表apis放入组件 return User.withUsername(username).password(password).authorities(apis.toArray(new String[apis.size()])) .build(); }; }4.7.4 设置访问路径需要的权限信息同样,我们通过注册组件,将访问路径需要的权限信息告知 Spring Security 。实例: @Bean public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() { return new WebSecurityConfigurerAdapter() { @Override public void configure(HttpSecurity httpSecurity) throws Exception { // 开启跨域支持 httpSecurity.cors(); // 从数据库中获取权限列表 List<String> paths = securityService.getApiPaths(); for (String path : paths) { /* 对/xxx/**路径的访问,需要具备xxx权限 例如访问 /addGoods,需要具备addGoods权限 */ httpSecurity.authorizeRequests().antMatchers("/" + path + "/**").hasAuthority(path); } // 未登录时自动跳转/notLogin httpSecurity.authorizeRequests().and().formLogin().loginPage("/notLogin") // 登录处理路径、用户名、密码 .loginProcessingUrl("/login").usernameParameter("username").passwordParameter("password") .permitAll() // 登录成功处理 .successHandler(new AuthenticationSuccessHandler() { @Override public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { httpServletResponse.setContentType("application/json;charset=utf-8"); ResultBo result = new ResultBo<>(); ObjectMapper mapper = new ObjectMapper(); PrintWriter out = httpServletResponse.getWriter(); out.write(mapper.writeValueAsString(result)); out.close(); } }) // 登录失败处理 .failureHandler(new AuthenticationFailureHandler() { @Override public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { httpServletResponse.setContentType("application/json;charset=utf-8"); ResultBo result = new ResultBo<>(new Exception("登录失败")); ObjectMapper mapper = new ObjectMapper(); PrintWriter out = httpServletResponse.getWriter(); out.write(mapper.writeValueAsString(result)); out.flush(); out.close(); } }); // 禁用csrf(跨站请求伪造) httpSecurity.authorizeRequests().and().csrf().disable(); } }; }按上面的设计,当用户发起访问时:未登录的访问会自动跳转到/notLogin 访问路径。通过 /login 访问路径可以发起登录请求,用户名和密码参数名分别为 username 和 password 。登录成功或失败会返回 ResultBo 序列化后的 JSON 字符串,包含登录成功或失败信息。访问 /xxx 形式的路径,需要具备 xxx 权限。用户所具备的权限已经通过上面的 UserDetailsService 组件告知 Spring Security 了。
- 2.1 配置流程 打开项目中的 pom.xml 文件,添加项目对 Thymeleaf 包的依赖;<dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.11.RELEASE</version></dependency>打开项目中的 WebConfig 配置类。在类中添加一个 ApplicationContext 类型的属性。并让 Spring 自动注入进来;@Autowiredprivate ApplicationContext applicationContext;Tips: Thymeleaf 相关组件需要依赖上下文容器对象。在 WebConfig 配置类中配置 Thymeleaf 模板组件信息,并指定模板文件存放位置;@Beanpublic SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(this.applicationContext); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode(TemplateMode.HTML); templateResolver.setCacheable(true); //templateResolver.setOrder(1); return templateResolver;}Tips: Spring MVC 项目中可以使用多视图技术。可以使用模板对象的 setOrder ( ) 指定查找顺序。本章节主要讲解 Thymeleaf 视图技术。所以,请大家注释掉配置过的其它视图技术的相关信息。在 WebConfig 配置类中指定模板引擎对象;先配置 SpringTemplateEngine 组件: 从字面上很好理解,模板引擎组件。@Beanpublic SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true); return templateEngine;}Tips: 这里有组件与组件的依赖关系。 配置 ThymeleafViewResolver 组件: 视图解析组件,依赖于模板引擎,模板引擎依赖模板资源。@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine); viewResolver.setCharacterEncoding("UTF-8"); return viewResolver;}经过上述配置后,Spring MVC 就具有了对 Thymeleaf 的支持。
- 5. 自定义配置项 我们还可以在配置文件中使用自定义配置,例如我们开发了一个微信公众号后台应用,需要在程序中配置公众号的 appid 和 secret 。配置文件如下:实例:# 公众号appidwxmp.appid=111# 公众号secretwxmp.secret=222我们定义一个组件,通过 @Value 注解注入配置项的值。实例:/** * 微信公众号参数 */@Component//注册为组件public class WxMpParam { @Value("${wxmp.appid}")//注入wxmp.appid配置项 private String appid; @Value("${wxmp.secret}")//注入wxmp.secret配置项 private String secret; //省略get set方法}通过控制器测试配置项是否注入成功。实例:@RestController public class HelloController { @Autowired private WxMpParam wxMpParam; @GetMapping("/hello") public Map hello() { Map<String, String> map = new HashMap<String, String>(); map.put("appid",wxMpParam.getAppid()); map.put("secret",wxMpParam.getSecret()); return map; }}此时我们访问 http://127.0.0.1:8000/spring-boot-profile/hello ,浏览器显示如下,说明我们的配置注入成功。浏览器显示返回数据
- 4.3 数据源配置 修改 application.properties 文件,配置数据源信息。Spring Boot 会将数据源自动注入到 MyBatis 的 sqlSessionFactory 组件中。对于我们开发者来说,这一切都是自动实现的, MyBatis 同样可以开箱即用,简单到爆炸。实例:# 配置数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver# 配置数据库urlspring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC# 配置数据库用户名spring.datasource.username=root# 配置数据库密码spring.datasource.password=Easy@0122
- 2. 依赖注入案例 2.1概念介绍知识回顾对于依赖注入,我们在第一章第一节已经介绍过,我们回顾一下概念解释上面是我们之前对于依赖注入的一个通俗解释。那么这里再着重强调一下 IOC 控制反转与 DI 依赖注入的关系:IOC 控制反转是将对象实例化的动作交由了 Spring 框架, 它的作用是降低了程序的耦合,不需要我们手动的创建对象,但是程序的耦合性还是存在。对象中肯定会有一些其余对象的引用,那么这种引用就称呼为对象的依赖,而 DI 依赖注入其实 是 IOC 设计思想的一种表现形式。对于 这种属性依赖,我们无需手动赋予,也是讲赋值的动作交给 Spring ,那么这种操作就是 依赖注入。依赖注入方式:第一种方式是通过 xml 配置的方式实现;第二种方式是在属性或者方法上使用注解的方式实现。那么,本章节先带大家体验下 xml 方式实现依赖注入。2.2 工程实现:搭建动作介绍创建一个 maven 工程导入Spring 使用的依赖编写业务层的 Service 和持久层的 Dao java 类编写 Spring 的配置文件创建工程 导入依赖 省略可以参考之前创建过的IOC工程java 代码创建 Servcie 的接口和接口的实现类,代码如下://接口代码public interface UserService { public void deleteById(Integer id);}//实现类代码public class UserServiceImpl implements UserService { private UserDao userDao; public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void deleteById(Integer id) { System.out.println("删除的方法执行"); }}UserDao 接口和实现类代码://dao接口代码public interface UserDao {}//dao实现类代码public class UserDaoImpl implements UserDao {}代码解释: dao的接口和实现类中并没有方法,只是为了测试 作为service中的属性依赖,可以实现由 Spring 完成动态注入。重点来了:spring 的核心配置文件:配置解释:在上面的配置文件中:bean 标签是描述一个被实例化的类 而 property 则表示一类中的属性property 标签中的属性 name 一般我们写成类中的属性名称, 实际上,起决定作用的并不是属性名,下面示例再展示ref 表示当前的属性 是一个引用对象,而引用的是谁呢? ref 中的值 必须是在容器中已经实例化的一个引用对象的唯一标识。value 当前的属性可以直接赋值,所以通过 value 中,填写要赋予的数值即可测试结果代码解释可以看到 我们得到了 service 中的类属性 Userdao 的实例,并且也 得到了 字符串属性 userName的值 zs2.3 property注入属性的解释刚刚我们在上面的示例中 展示了xml依赖属性的注入,也是比较好理解。这里我们强调一下使用的注意事项:如果是 property 属性标签实现属性注入,那么类中必须由配置在 property 标签中 name 属性的 set 方法下面我们测试一下set方法的改变:先讲 service 中 dao 的 set 方法改造如下:public void setDao(UserDao userDao) { System.out.println("执行了set方法 给dao属性赋值"); this.userDao = userDao;}这时候代码中的set方法变成了 setDao 配置文件不变,依然是<property name="userDao" ref="userDao"></property>我们看看会产生什么问题Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'userDao' of bean class [com.wyan.service.UserServiceImpl]: Bean property 'userDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:247) at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:426) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:278) at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:266) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:97) at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:77) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1646)可以看到异常的堆栈信息 无效的 userDao 属性, userDao 不可以 或者 没有有效的 setter 方法提供。更改xml文件中的 property 标签的 name 属性 为 dao<property name="dao" ref="userDao"></property>测试结果如下:所以我们说 property 中的 name 属性不一定要跟 Java类中的属性名保持一致 而是必须跟 setter 方法的名称一致
spring 配置 注入相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议