2014-09-24 5 views
0

Есть ли какая-либо аннотация в Spring для создания экземпляра класса util. Я использую класс, который используется служебным слоем.Создание экземпляра класса Util весной

Util Класс

Class CipherUtil { 
    private static final String SECRET_KEY = "sEcrEtkEy"; 
    private static Cipher cipher; 
    private static SecretKeySpec secretKeySpec; 

    public CipherUtil() { 
    //initilize cipher and secretKeySpec properties 
    } 

    public static String encrypt(String plainText) { ... } 

    public static String decrypt(String encryptedText) { ... } 
} 

Класс обслуживания

Class MyService { 
    @Autowired OtherService otherService; 

    public void doSomething() { 
     //CipherUtil is null 
     String decryptedMsg = CipherUtil.encrypt("Hello World!!!"); 
    } 
} 

Как я могу сказать Spring создать класс CipherUtil, прежде чем использовать в методе?

+0

Это статические методы, и они используют статические свойства; вам не нужен экземпляр. –

+0

У вас нет. Погрузчик классов выполнит инициализацию для вас, поскольку метод является статическим. – Ordous

+1

Вы должны изменить это на статический инициализатор. – SLaks

ответ

2

Checkstyle имеет хорошее правило для классов Util, в котором говорится:
классов Utility не должны иметь какие-либо не-частные конструкторов и должны быть окончательными.

Это связано с тем, что вы не хотите, чтобы теневое взаимодействие с вашими методами и потому, что если вам нужен конструктор, то это не класс полезности.

Возвращаясь к вашему примеру:

Имея конструктор инициализации статических полей является BAD.

Почему? Потому что они изменяемы.

Вы говорите, что можете изменить их, сделав их нефинальными. Итак, предположим, что ваш метод что-то делает с ними, меняя их значения, а затем идет другой поток и создает другой экземпляр вашего объекта во время работы этого метода. И, следовательно, - сброс статических полей. Ваш метод внезапно ломается ужасно без каких-либо видимых причин, и вы не сможете воспроизвести его.

Лучший способ сделать это - сделать поля окончательными. Если они непреложны, тогда нет никакой опасности. Но как вы их инициализируете? Вы не можете использовать конструктор (ошибка компилятора). Что может помочь static initializers. Они запускаются один раз, когда класс загружается и имеет полный доступ к статическим полям. Вы можете использовать один блок для установки ваших значений.

Если поля являются mutable, то их статические и инициализировать в конструкторе - это самое худшее, что вы можете сделать. Переосмыслите свой дизайн. В противном случае вы открываете совершенно новую банку червей в проблемах с потоками.

Слова предупреждения:

Я не уверен в коде, который вы дали, но мне кажется, что с помощью статических-одиночек Util класса является плохой идеей здесь. Большинство приложений захотят менять ключи время от времени, а нетривиальная логика в статическом классе очень трудно проверить. Есть лучшие способы сделать это, самые простые из которых - сделать ваш CipherUtil фактическим компонентом.

0

Классы Java по умолчанию являются закрытыми.

См: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Сделайте ваш класс Utils общественности окончательным.

public final class CipherUtil { ... } 

Кроме того, если вы хотите инициализировать любые статические переменные класса, вам нужно будет использовать статический инициализатор.

public final class CipherUtil { 

    private static final String SECRET_KEY; 

    // Can't be instantiated 
    private CipherUtil(){ } 

    static{ 
    //Initialize stuff here 
    SECRET_KEY = "sEcrEtkEy"; 
    } 

} 
+0

Классы Java по умолчанию являются частными пакетами, как и их члены. Эти Utils все еще могут использоваться в одном пакете в версии OPs (хотя они, вероятно, означали, что они являются «общедоступными») – Ordous

+0

_Java-классы являются private по умолчанию_ ложными, но как бы это было даже актуально? –

+0

Простите мое невежество, я хотел сказать, что пакет приватен. Ред. Я также обычно объявлял бы класс окончательным для намерения, а также объявлял бы конструктор частным, чтобы избежать создания какого-либо экземпляра. – proulxs