一、注解基础
1、组件扫描(component scanning)
Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件
2、特定组件包括
- @Component 基本注解,标示一个受spring管理的组件
- @Respository 标识持久层组件
- @Service 标识服务层(业务层)组件
- @Controller 标识表现层组件
3、spring配置文件中声明<context:component-scan>
- base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类
- 当需要扫描多个包时,可用使用逗号分隔
如果仅希望扫描特定的类而非基包下的所有类,可用使用resource-pattern属性过滤特定的类,例如
<context:component-scan
base-package="io.spring.beans"
resource-pattern="autowire/*.class" />
- <context:include-filter>子节点表示要包含的目标类
- <context:exclude-filter>子节点表示要排除在外的目标类
- <context:component-scan>下可以拥有若干<context:include-filter>和<context:exclude-filter>子节点
二、创建实例
1、首先引入 spring-aop-4.2.5.RELEASE.jar
2、新建io.spring.annotation包,创建TestObject.java 和 Main.java
package io.spring.annotation;
import org.springframework.stereotype.Component;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:03:29
* @version 1.0
*/
@Component
public class TestObject {
}
Main.java
package io.spring.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import io.spring.annotation.controller.UserController;
import io.spring.annotation.repository.UserRepository;
import io.spring.annotation.service.UserService;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:10:34
* @version 1.0
*/
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");
TestObject to = (TestObject) ctx.getBean("testObject");
System.out.println(to);
UserController userController = (UserController) ctx.getBean("userController");
System.out.println(userController);
UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");
System.out.println(userRepository);
UserService userService = (UserService) ctx.getBean("userService");
System.out.println(userService);
}
}
3、新建io.spring.repository包,创建文件UserRepository.java、UserRepositoryImpl.java
package io.spring.annotation.repository;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:04:47
* @version 1.0
*/
public interface UserRepository {
public void save();
}
UserRepositoryImpl.java
package io.spring.annotation.repository;
import org.springframework.stereotype.Repository;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:05:40
* @version 1.0
*/
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {
@Override
public void save() {
System.out.println("UserRepository Save...");
}
}
4、新建io.spring.service包,新建UserService.java
package io.spring.annotation.service;
import org.springframework.stereotype.Service;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:06:33
* @version 1.0
*/
@Service
public class UserService {
public void add() {
System.out.println("UserService add...");
}
}
5、新建io.spring.controller包,新建UserController.java
package io.spring.annotation.controller;
import org.springframework.stereotype.Controller;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:07:17
* @version 1.0
*/
@Controller
public class UserController {
public void execute() {
System.out.println("UserController execute...");
}
}
6、执行Main.java,正确结果如下:
三、组件装配 @AutoWire @Resource
使用@AutoWire修改上面的例子
1、io.spring.annotation.repository
package io.spring.annotation.repository;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:04:47
* @version 1.0
*/
public interface UserRepository {
public void save();
}
package io.spring.annotation.repository;
import org.springframework.stereotype.Repository;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:05:40
* @version 1.0
*/
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {
@Override
public void save() {
System.out.println("UserRepository Save...");
}
}
2、io.spring.annotation.service
package io.spring.annotation.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import io.spring.annotation.repository.UserRepository;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:06:33
* @version 1.0
*/
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void add() {
System.out.println("UserService add...");
userRepository.save();
}
}
3、io.spring.annotation.controller
package io.spring.annotation.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import io.spring.annotation.service.UserService;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:07:17
* @version 1.0
*/
@Controller
public class UserController {
@Autowired
private UserService userService;
public void execute() {
System.out.println("UserController execute...");
userService.add();
}
}
4、io.spring.annotation
package io.spring.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import io.spring.annotation.controller.UserController;
import io.spring.annotation.repository.UserRepository;
import io.spring.annotation.service.UserService;
/**
* @author 胖胖のALEX E-mail:zanbin168@qq.com
* @date 2016年4月7日 下午11:10:34
* @version 1.0
*/
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");
//
// TestObject to = (TestObject) ctx.getBean("testObject");
// System.out.println(to);
//
UserController userController = (UserController) ctx.getBean("userController");
System.out.println(userController);
userController.execute();
//
// UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");
// System.out.println(userRepository);
//
// UserService userService = (UserService) ctx.getBean("userService");
// System.out.println(userService);
}
}
输入结果: