config/src/main/java/org/springframework/security/config/annotation/AbstractConfiguredSecurityBuilder.java
@SuppressWarnings("unchecked")
	private <C extends SecurityConfigurer<O, B>> void add(C configurer) throws Exception {
		Assert.notNull(configurer, "configurer cannot be null");

		Class<? extends SecurityConfigurer<O, B>> clazz = (Class<? extends SecurityConfigurer<O, B>>) configurer
				.getClass();
		synchronized (configurers) {
			if (buildState.isConfigured()) {
				throw new IllegalStateException("Cannot apply " + configurer
						+ " to already built object");
			}
			List<SecurityConfigurer<O, B>> configs = allowConfigurersOfSameType ? this.configurers
					.get(clazz) : null;
			if (configs == null) {
				configs = new ArrayList<SecurityConfigurer<O, B>>(1);
			}
			configs.add(configurer);
			this.configurers.put(clazz, configs);
			if (buildState.isInitializing()) {
				this.configurersAddedInInitializing.add(configurer);
			}
		}
	}
@SuppressWarnings("unchecked")
	private <C extends SecurityConfigurer<O, B>> void add(C configurer) throws Exception {
		Assert.notNull(configurer, "configurer cannot be null");

		Class<? extends SecurityConfigurer<O, B>> clazz = (Class<? extends SecurityConfigurer<O, B>>) configurer
				.getClass();
		synchronized (configurers) {
			if (buildState.isConfigured()) {
				throw new IllegalStateException("Cannot apply " + configurer
						+ " to already built object");
			}
			List<SecurityConfigurer<O, B>> configs = allowConfigurersOfSameType ? this.configurers
					.get(clazz) : null;
			if (configs == null) {
				configs = new ArrayList<SecurityConfigurer<O, B>>(1);
			}
			configs.add(configurer);
			this.configurers.put(clazz, configs);
			if (buildState.isInitializing()) {
				this.configurersAddedInInitializing.add(configurer);
			}
		}
	}
@ SuppressWarnings ( "unchecked" ) private < C extends SecurityConfigurer < O , B > > void add ( C configurer ) throws Exception { Assert . notNull ( configurer , "configurer cannot be null" ) ; Class < ? extends SecurityConfigurer < O , B > > clazz = ( Class < ? extends SecurityConfigurer < O , B > > ) configurer . getClass ( ) ; synchronized ( configurers ) { if ( buildState . isConfigured ( ) ) { throw new IllegalStateException ( "Cannot apply " + configurer + " to already built object" ) ; } List < SecurityConfigurer < O , B > > configs = allowConfigurersOfSameType ? this . configurers . get ( clazz ) : null ; if ( configs == null ) { configs = new ArrayList < SecurityConfigurer < O , B > > ( 1 ) ; } configs . add ( configurer ) ; this . configurers . put ( clazz , configs ) ; if ( buildState . isInitializing ( ) ) { this . configurersAddedInInitializing . add ( configurer ) ; } } }
Adds {@link SecurityConfigurer} ensuring that it is allowed and invoking
{@link SecurityConfigurer#init(SecurityBuilder)} immediately if necessary.

@param configurer the {@link SecurityConfigurer} to add
@throws Exception if an error occurs
Adds { @link SecurityConfigurer } ensuring that it is allowed and invoking { @link SecurityConfigurer#init ( SecurityBuilder ) } immediately if necessary .