如何在 java class 中创建 Spring Security 3.1 数据源 bean

How to create Spring Security 3.1 Datasource bean in a java class

我是 JSF 和 Spring 安全的新手。 我正在构建一个基于 this tutorial 的 JSF 2 项目。我想将数据源 bean 放在 java class 中,因为我正在为另一个 class 中的 JDBC 连接和用户生成 url。 如何将此代码从我的安全-config.xml 放到 java class.

 <beans:bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url" value="jdbc:mysql://localhost:3306/spring_security_db" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="" />
 </beans:bean>

一种解决方案是使用 Spring 的 expression language。可以指定方法调用来检索,例如url参数:

<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <beans:property name="url" value="#{someOtherBean.someMethod()}" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="" />
</beans:bean>

您需要定义您正在引用其方法的另一个 bean。编程方法是这样的:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
public class AppConfig {

    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/spring_security_db");
        dataSource.setUsername("root");
        dataSource.setPassword("");

        return dataSource;
    }
}

在您的 Spring 配置中,您需要使用适当的包指定组件扫描以获取 bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:context="http://www.springframework.org/schema/context" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="yourpackage.configpackage"/>          

</beans>

您应该创建一个新的 Class,它实现了 DriverManagerDataSource 的构造函数,然后在您的 beans 定义中的 class 标记中输入 Class 的名称。 你的 Class 是这样的:

package dao; 
public class dataSource extends DriverManagerDataSource { 
 public dataSource() { 
 // TODO Auto-generated constructor stub 
  this.setDriverClassName("com.mysql.jdbc.Driver"); 
  this.setUrl("jdbc:mysql://.../....."); 
  this.setUsername(""); this.setPassword(""); 
   }
}

你的 bean 定义是这样的:

<beans:bean id="dataSource" class="dao.dataSource">