MG>maybe.. see below

________________________________
From: Zahid Rahman <zahidr1...@gmail.com>
Sent: Friday, December 13, 2019 5:09 PM
To: Struts Users Mailing List <user@struts.apache.org>
Subject: Re: Java Singleton , Framework Design Patterns

Hi,

>?am interested to know which topic prompts your question ?
As you can see from the log file (below) the spring framework creates and
destroys a  singleton of a bean.
So the singleton pattern is used by the container.
I was also informed that the singleton is used to create a login screen.
That also appears to be the case from the page
http://www.blackwasp.co.uk/Singleton.aspx.

The login screen I will be using is the login.java and login.jsp in the
struts2  "blank app" in "struts-examples-master".
The struts framework also helps me with duplicate form submission.
So do I need to use the singleton pattern  ?

MG>here is ted husted struts-blank login.java (un-edited)
/*
 * $Id: Login.java 471756 2006-11-06 15:01:43Z husted $
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package example;
public class Login extends ExampleSupport {
    public String execute() throws Exception {
        if (isInvalid(getUsername())) return INPUT;
        if (isInvalid(getPassword())) return INPUT;
        return SUCCESS;
    }
    private boolean isInvalid(String value) {
        return (value == null || value.length() == 0);
    }
    private String username;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    private String password;
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

//no singleton yet as there is no public static ClassName getInstance()
//with private constructor pointing to getInstance()

//BUT singleton is used to instantate and set default ObjectFactory for 
XmlConfigurationProvider
//as seen here in ConfigurationTestBase.java
package com.opensymphony.xwork2.config.providers;
public abstract class ConfigurationTestBase extends 
com.opensymphone.xwork2.XWorkTestCase {
    protected com.opensymphony.xwork2.config.ConfigurationProvider 
buildConfigurationProvider(final String filename) {
        configuration = new 
com.opensymphony.xwork2.config.providers.MockConfiguration();
        
((com.opensymphony.xwork2.config.providers.MockConfiguration)configuration).selfRegister();
        container = configuration.getContainer();
        XmlConfigurationProvider prov = new XmlConfigurationProvider(filename, 
true);
        
prov.setObjectFactory(container.getInstance(com.opensymphony.xwork2.ObjectFactory.class));

//but the provider does not use Spring Object Factory which we can remedy here
        
prov.setObjectFactory(container.getInstance(com.opensymphony.xwork2.spring.SpringObjectFactory.class));

//as you mention we must follow springs example of declaring singleton bean in 
./WEB-INF/<application>context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd";>
<beans default-autowire="byName">
    <bean id="default" 
class="com.opensymphony.xwork2.spring.SpringObjectFactory" singleton="true" />

//where struts specifies default <Spring>ObjectFactory thru 
./classes/org/apache/struts2/default.properties
### if specified, the default object factory can be overridden here
### Note: short-hand notation is supported in some cases, such as "spring"
###       Alternatively, you can provide a 
com.opensymphony.xwork2.ObjectFactory subclass name here
struts.objectFactory=com.opensymphony.xwork2.spring.SpringObjectFactory.class

//the line 
struts.objectFactory=com.opensymphony.xwork2.spring.SpringObjectFactory.class 
in default.properties should be sufficient
//to route all instances of ObjectFactory to SpringObjectFactory

does this help?

 2019-12-13 21:01:06,882 [main] [DEBUG]
o.s.b.f.s.DefaultListableBeanFactory - Pre-instantiating singletons in
org.springframework.beans.factory.support.DefaultListableBeanFactory@6f1d30d:
defining beans [numberGenerator]; root of factory hierarchy
2019-12-13 21:01:06,882 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Creating shared instance of singleton bean 'numberGenerator'
2019-12-13 21:01:06,882 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Creating instance of bean 'numberGenerator'
2019-12-13 21:01:06,895 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Eagerly caching bean 'numberGenerator' to allow for resolving potential
circular references
2019-12-13 21:01:06,896 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Finished creating instance of bean 'numberGenerator'
2019-12-13 21:01:06,897 [main] [DEBUG]
o.s.c.s.ClassPathXmlApplicationContext - Unable to locate
LifecycleProcessor with name 'lifecycleProcessor': using default
[org.springframework.context.support.DefaultLifecycleProcessor@d967f908]
2019-12-13 21:01:06,897 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Returning cached instance of singleton bean 'lifecycleProcessor'
2019-12-13 21:01:06,900 [main] [DEBUG]
o.s.c.e.PropertySourcesPropertyResolver - Could not find key
'spring.liveBeansView.mbeanDomain' in any property source
2019-12-13 21:01:06,910 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Returning cached instance of singleton bean 'numberGenerator'
2019-12-13 21:01:06,910 [main] [INFO ] academy.learnprogramming.Main -
number = 0
2019-12-13 21:01:06,912 [main] [INFO ]
o.s.c.s.ClassPathXmlApplicationContext - Closing
org.springframework.context.support.ClassPathXmlApplicationContext@3e92e10:
startup date [Fri Dec 13 21:01:06 GMT 2019]; root of context hierarchy
2019-12-13 21:01:06,912 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Returning cached instance of singleton bean 'lifecycleProcessor'
2019-12-13 21:01:06,912 [main] [DEBUG] o.s.b.f.s.DefaultListableBeanFactory
- Destroying singletons in
org.springframework.beans.factory.support.DefaultListableBeanFactory@6f1d30d:
defining beans [numberGenerator]; root of factory hierarchy

On Fri, 13 Dec 2019 at 01:33, Martin Gainty <mgai...@hotmail.com> wrote:

> Singleton:
> i prefer thread-safe implementations and generally eschew singletons
> (unless extreme political pressure dictates otherwise)
> https://www.geeksforgeeks.org/singleton-design-pattern/
> [https://www.geeksforgeeks.org/wp-content/uploads/gfg_200X200.png]<
> https://www.geeksforgeeks.org/singleton-design-pattern/>
> Singleton Design Pattern | Implementation - GeeksforGeeks<
> https://www.geeksforgeeks.org/singleton-design-pattern/>
> The singleton pattern is one of the simplest design patterns. Sometimes we
> need to have only one instance of our class for example a single DB
> connection shared by multiple objects as creating a separate DB connection
> for every object may be costly. Similarly, there can be a single
> configuration ...
> www.geeksforgeeks.org<http://www.geeksforgeeks.org>
>
> Design Patterns:
> have a look at this discussion from stackoverflow on Visitor Pattern vs
> Command Pattern for lambda expresssions
> https://stackoverflow.com/questions/2186931/java-pass-method-as-parameter
> [
> https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-i...@2.png?v=73d79a89bded
> ]<
> https://stackoverflow.com/questions/2186931/java-pass-method-as-parameter>
> interface - Java Pass Method as Parameter - Stack Overflow<
> https://stackoverflow.com/questions/2186931/java-pass-method-as-parameter>
> In Java 8, you can now pass a method more easily using Lambda Expressions
> and Method References. First, some background: a functional interface is an
> interface that has one and only one abstract method, although it can
> contain any number of default methods (new in Java 8) and static methods. A
> lambda expression can quickly implement the abstract method, without all
> the unnecessary syntax ...
> stackoverflow.com
> although this discussion is more specific on when to implement Visitor
> Pattern vs when to use Command Pattern
>
> https://stackoverflow.com/questions/2857880/command-pattern-vs-visitor-pattern
> [
> https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-i...@2.png?v=73d79a89bded
> ]<
> https://stackoverflow.com/questions/2857880/command-pattern-vs-visitor-pattern
> >
> Command Pattern vs. Visitor Pattern - Stack Overflow<
> https://stackoverflow.com/questions/2857880/command-pattern-vs-visitor-pattern
> >
> Each pattern has it's own pros, cons and use cases. You can use Command
> pattern to . Decouple the invoker & receiver of command . Implement
> callback mechanism. Implement undo and redo functionality. Maintain a
> history of commands. Use Visitor pattern in below scenarios:. Similar
> operations have to be performed on objects of different types grouped in a
> structure ; You need to execute many ...
> stackoverflow.com
>
> ?am interested to know which topic prompts your question?
>
> /br/
> Martin
> ________________________________
> From: Lukasz Lenart <lukaszlen...@apache.org>
> Sent: Thursday, December 12, 2019 1:56 AM
> To: Struts Users Mailing List <user@struts.apache.org>
> Subject: Re: Java Singleton , Framework Design Patterns
>
> czw., 12 gru 2019 o 06:13 Zahid Rahman <zahidr1...@gmail.com> napisał(a):
> > So my point is I have not been able to find accurate information , if
> some
> > one could furnish me a Java language specification or recommend  a book
> > which accurately describes these I would be grateful.
>
> Start with Gang of Four
> http://www.blackwasp.co.uk/gofpatterns.aspx
>
>
> Regards
> --
> Łukasz
> + 48 606 323 122 http://www.lenart.org.pl/
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> For additional commands, e-mail: user-h...@struts.apache.org
>
>

Reply via email to