2011-08-20 18 views
63

tôi đã có được Grails mới nhất 2.0 mốc, và tôi nhìn thấy một cảnh báo không dùng nữa cho lớp ConfigurationHolder:Làm cách nào để truy cập cấu hình Grails trong Grails 2.0?

org.codehaus.groovy.grails.commons.ConfigurationHolder 

Thông điệp deprecation chỉ đơn giản nói "Sử dụng dependency injection thay vì" đó không phải là rất hữu ích cho tôi. Tôi hiểu tiêm phụ thuộc, nhưng làm thế nào tôi có thể kết nối một bean với cấu hình Grails phù hợp để tôi có thể truy cập nó trong thời gian chạy? Tôi cần truy cập vào cấu hình từ những nơi khác với Bộ điều khiển và Thẻ của tôi (chẳng hạn như BootStrap).

Trả lời

101
  • Nếu bạn cần nó trong một artifact hỗ trợ dependency injection, chỉ cần tiêm grailsApplication

    class MyController { 
        def grailsApplication 
    
        def myAction = { 
         def bar = grailsApplication.config.my.property 
        } 
    } 
    
  • Nếu bạn cần nó trong một bean trong , ví dụ: src/groovy hoặc src/java, dây nó lên bằng cách sử dụng conf/spring/resources.groovy

    // src/groovy/com/example/MyBean.groovy 
    class MyBean { 
        def grailsApplication 
    
        def foo() { 
         def bar = grailsApplication.config.my.property 
        } 
    } 
    
    // resources.groovy 
    beans = { 
        myBean(com.example.MyBean) { 
         grailsApplication = ref('grailsApplication') 
         // or use 'autowire' 
        } 
    } 
    
  • Bất kỳ nơi nào khác, có lẽ dễ nhất là chuyển đối tượng cấu hình đến lớp cần nó hoặc chuyển các thuộc tính cụ thể cần thiết.

    // src/groovy/com/example/NotABean.groovy 
    class NotABean { 
        def foo(def bar) { 
         ... 
        } 
    } 
    
    // called from a DI-supporting artifact 
    class MyController { 
        def grailsApplication 
        def myAction = { 
         def f = new NotABean() 
         f.foo(grailsApplication.config.my.property) 
        } 
    } 
    

Cập nhật:

Burt Beckwith thời gian gần đây đã viết một vài bài đăng trên blog về vấn đề này. One discusses usinggetDomainClass() từ trong các lớp miền, trong khi trường còn lại cung cấp tùy chọn creating your own holder class (nếu không có giải pháp nào ở trên phù hợp).

+0

Rob, câu trả lời rất hữu ích. Cảm ơn. – Polaris878

18

bạn có thể tiêm "grailsApplication" vào tệp nguồn của mình. đây là một conf mẫu/Bootstrap.groovy

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     println grailsApplication.config 
    } 

    def destroy = { 
    } 
} 
+0

+1, đề xuất rất tốt! – Polaris878

10

Một cách khác không tán thành để có được cấu hình là:

ApplicationContext context = ServletContextHolder.servletContext. 
     getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) 
     as ApplicationContext 
    ConfigObject config = context.getBean(GrailsApplication).config 

này hoạt động trong tình huống mà không có cha mẹ tiêm có sẵn, chẳng hạn như các lớp servlet hoặc các phương pháp tĩnh.

56

Một thay thế cho grailsApplication là Holders lớp,

import grails.util.Holders 

def config = Holders.config 

Bạn nhận được cấu hình trực tiếp tắt của chủ sở hữu, không tiêm cần thiết, đó là tốt đẹp cho các lớp tiện ích, vv

+0

Đây có lẽ là cách đơn giản nhất, vì có một ánh xạ trực tiếp 1: 1 cho lớp không được chấp nhận. – Andrew

+1

Khi nào 'grails.util.Holders' thích hợp hơn để tiêm' grailsApplication'? –

+2

@AlexanderSuraphel khi bạn không muốn Spring kiểm soát vòng đời của hạt của bạn. Ví dụ, một lớp tiện ích với các phương thức tĩnh công cộng. –

4

Bạn có thể truy cập vào cấu hình grails

  1. Trong điều khiển

    class DemoController { 
        def grailsApplication 
    
        def demoAction = { 
         def obj = grailsApplication.config.propertyInConfig 
        } 
    } 
    
  2. Trong dịch vụ:

    class DemoService { 
        def grailsApplication 
    
        def demoMethod = { 
         def obj = grailsApplication.config.propertyInConfig 
        } 
    } 
    
  3. Trong taglib:

    class DemoTaglib { 
        def grailsApplication 
    
        static namespace = "cd" 
    
        def demoMethod = { 
    
         def obj = grailsApplication.config.propertyInConfig 
    
         out << obj  
        } 
    } 
    

Bạn có thể gọi phương pháp này taglib theo quan điểm như <cd:demoMethod/>

  1. Theo quan điểm:

    <html> 
        <head><title>Demo</title></head> 
    <body> 
        ${grailsApplication.config.propertyInConfig} 
    </body> 
    
    </html> 
    
0

Để truy cập từ lớp miền làm:

import grails.util.Holders 

// more code 

static void foo() { 
    def configOption = Holders.config.myProperty 
} 
Các vấn đề liên quan