Java Swing + JPA + Spring

Ao tentar rodar minha aplicação estou tendo o seguinte erro:

Exception in thread "main" java.lang.NullPointerException
	at br.com.projeto.controller.ProdutoController.listar(ProdutoController.java:18)
	at br.com.projeto.ui.Main.main(Main.java:14)

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>br.com.projeto</groupId>
	<artifactId>teste</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>4.2.1.Final</version>
		</dependency>
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<version>1.3.173</version>
		</dependency>
		<dependency>
			<groupId>apache-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>3.2.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-jpa</artifactId>
			<version>1.3.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>3.2.4.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate.javax.persistence</groupId>
			<artifactId>hibernate-jpa-2.0-api</artifactId>
			<version>1.0.1.Final</version>
		</dependency>
	</dependencies>

</project>

src/main/resources/spring-context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd">

	<context:annotation-config />

	<jpa:repositories base-package="br.com.projeto.repository" />

	<context:component-scan
		base-package="br.com.projeto.controller, br.com.projeto.service, br.com.projeto.repository" />

	<bean id="placeholderConfig"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:hibernate.properties" />
	</bean>

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${hibernate.connection.driver_class}" />
		<property name="url" value="${hibernate.connection.url}" />
		<property name="username" value="${hibernate.connection.username}" />
		<property name="password" value="${hibernate.connection.password}" />
	</bean>

	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
		<property name="persistenceUnitName" value="projetoPU" />
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

</beans>

src/main/resources/hibernate.properties

hibernate.connection.driver_class=org.h2.Driver
hibernate.connection.url=jdbc:h2:tcp://localhost/~/projeto
hibernate.connection.username=sa
hibernate.connection.password=

src/main/resources/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

	<persistence-unit name="projetoPU" transaction-type="RESOURCE_LOCAL">

		<provider>org.hibernate.ejb.HibernatePersistence</provider>

		<class>br.com.projeto.model.Produto</class>

		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
			<property name="hibernate.default_schema" value="projeto" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="false" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
		</properties>

	</persistence-unit>

</persistence>

Main.java

package br.com.projeto.ui;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import br.com.projeto.controller.ProdutoController;

public class Main {

	public static void main(String[] args) {
		
		new ClassPathXmlApplicationContext("classpath:spring-context.xml");
		
		ProdutoController p = new ProdutoController();
		p.listar();

	}

}

ProdutoController

package br.com.projeto.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

import br.com.projeto.model.Produto;
import br.com.projeto.service.ProdutoService;

@Controller
public class ProdutoController {

	@Resource
	private ProdutoService produtoService;

	public List<Produto> listar() {
		return produtoService.listar();
	}

}

ProdutoService

package br.com.projeto.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.projeto.model.Produto;
import br.com.projeto.repository.ProdutoRepository;

@Service
public class ProdutoService {

	@Resource
	private ProdutoRepository produtoRepository;
	
	@Transactional
	public List<Produto> listar(){
		return produtoRepository.listar();
	}
	
}

ProdutoRepository

package br.com.projeto.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import br.com.projeto.model.Produto;

@Repository
public class ProdutoRepository {

	@PersistenceContext
	protected EntityManager entityManager;
	
	@SuppressWarnings("unchecked")
	public List<Produto> listar(){
		Query query = entityManager.createNativeQuery("SELECT * FROM produto", Produto.class);
		return query.getResultList();
	}
	
}

Na classe Main.java, você instancia o ProdutoController na mão.
Deste jeito, as anotações do Spring não funcionam.

Você tem que recuperar o ProdutoController do contexto Spring.

No final desta página, há um exemplo de uma classe (ApplicationContextProvider) que retorna o ApplicationContext para você.
https://mythinkpond.wordpress.com/2010/03/22/spring-application-context/

Tendo o ApplicationContext você pode usar o método ApplicationContext.getBean(ProdutoController.class) para retornar o bean correto.

A propósito, você precisa de todas essas camadas? (ProdutoController, ProdutoService, ProdutoRepository)