首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring + SpringMVC + Hibernate 全註解配置實戰(基於 Java Config)

     編輯:Java 綜合教學

為什麼選擇 Java Config?

XML 配置雖解耦但缺乏編譯期檢查,純註解又侵入業務代碼。Java Config(Spring 3.0+) 完美結合兩者優勢:類型安全、重構友好、IDE 智能提示、邏輯可編程,成為現代 Spring 應用首選配置方式。

項目結構概覽

src/main/java
├── config
│   ├── WebInitializer.java      // Servlet 3.0+ 容器啟動入口
│   ├── WebConfig.java           // SpringMVC Web 層配置
│   ├── RootConfig.java          // 業務層、數據層配置
│   └── HibernateConfig.java     // Hibernate 會話工廠配置
├── entity
│   └── User.java                // JPA 實體
├── service
│   └── UserService.java
└── web
    └── UserController.java

核心配置類詳解

1. WebInitializer - 替代 web.xml

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override protected Class[] getRootConfigClasses() { return new Class[]{ RootConfig.class }; }
    @Override protected Class[] getServletConfigClasses() { return new Class[]{ WebConfig.class }; }
    @Override protected String[] getServletMappings() { return new String[]{ "/" }; }
    @Override protected void customizeRegistration(Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement("/temp", 2097152, 4194304, 0));
    }
}
  • 繼承 AbstractAnnotationConfigDispatcherServletInitializer 自動實現 WebApplicationInitializer,Servlet 3.0+ 容器啟動時自動發現並初始化。
  • getRootConfigClasses 對應 ContextLoaderListener 加載的根上下文(Service、DAO、數據源)。
  • getServletConfigClasses 對應 DispatcherServlet 加載的 Web 上下文(Controller、ViewResolver、HandlerMapping)。

2. WebConfig - SpringMVC 配置

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "scau.zzf.web", useDefaultFilters = false,
    includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class))
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean public ViewResolver viewResolver() {
        InternalResourceViewResolver r = new InternalResourceViewResolver();
        r.setPrefix("/WEB-INF/views/"); r.setSuffix(".jsp");
        r.setExposeContextBeansAsAttributes(true); return r;
    }
    @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable(); // 靜態資源轉發給容器默認 Servlet
    }
}

3. RootConfig - 業務與數據層掃描

@Configuration
@Import(HibernateConfig.class)
@ComponentScan(basePackages = "scau.zzf",
    excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, value = RootConfig.WebPackage.class))
public class RootConfig {
    public static class WebPackage extends RegexPatternTypeFilter {
        public WebPackage() { super(Pattern.compile("scau\\.zzf\\.web")); }
    }
}

掃描除 web 包外的所有組件(@Service、@Repository、@Component),避免與 WebConfig 重複掃描 Controller。

4. HibernateConfig - 會話工廠與數據源

@Configuration
@PropertySource("classpath:ds/ds-jdbc.properties")
public class HibernateConfig {
    @Value("${jdbc.driverClassName}") private String driver;
    @Value("${jdbc.url}") private String url;
    @Value("${jdbc.username}") private String user;
    @Value("${jdbc.password}") private String pass;

    @Bean public DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driver); ds.setUrl(url);
        ds.setUsername(user); ds.setPassword(pass);
        return ds;
    }

    @Bean public SessionFactory sessionFactoryBean() throws IOException {
        LocalSessionFactoryBean lsfb = new LocalSessionFactoryBean();
        lsfb.setDataSource(dataSource());
        lsfb.setPackagesToScan("scau.zzf.entity");
        Properties props = new Properties();
        props.setProperty("dialect", "org.hibernate.dialect.MySQLDialect");
        lsfb.setHibernateProperties(props);
        lsfb.afterPropertiesSet();
        return lsfb.getObject();
    }

    @Bean public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer(); // 解析 ${...} 佔位符
    }
}

5. 實體類示例

@Entity @Table(catalog = "hibernate", name = "users")
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id;
    @Column private String username;
    @Column private String password;
    @Column private String sex;
    @Column private String address;
    @Column private int enabled;
    // getter/setter 省略
}

測試驗證

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebConfig.class, RootConfig.class})
@WebAppConfiguration
public class ServiceTest {
    @Autowired private UserService userService;
    @Test public void userServiceTest() {
        User u = userService.findUser(1);
        System.out.println(u.getUsername());
    }
}
  • 三個註解缺一不可:@RunWith 整合 Spring Test、@ContextConfiguration 指定配置類、@WebAppConfiguration 模擬 ServletContext。

關鍵優勢總結

  • 類型安全:重構重命名類/方法,配置代碼同步更新,杜絕 XML 拼寫錯誤。
  • 邏輯可編程:條件裝配 @Profile、動態屬性注入、複雜 Bean 初始化邏輯皆可用 Java 代碼實現。
  • 分層清晰:RootConfig / WebConfig 職責分離,避免上下文混淆與 Bean 重複創建。
  • 零 XML:WebInitializer 完全替代 web.xml,適配雲原生容器化部署。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved