Spring是一個非常主流,而且是好用的框架。提供管理對象的容器,提供事務的支持,緩存,權限認證(往往不用)。用來集成hibernate等。而管理對象的生命周期是其中一個非常重要的功能。在Spring中通過IOC可以輕松實現解耦,而開發人員則可以更專心於業務邏輯的編寫。
第一種情況:管理Dao,Service,Manage等bean
配置的方式:(開發中一般以第二種居多)
1:通過xml
<bean id="messageHelper" class="com.dtsz.framework.core.spring.MessageHelper"/>
2:通過注解和掃描
2.1 指定掃描的范圍:
<!-- 使用annotation 自動注冊bean, 並保證@Required、@Autowired的屬性被注入 --> <context:component-scan base-package="com.dtsz"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
這句話的意思就是,我掃描com.dtsz的包下bean。交給spring容器管理
2.2 通過注解標識bean
@Service @Transactional public class UserManager extends BaseService{ @Resource UserDao userDao; private static Logger logger = LoggerFactory .getLogger(UserManager.class); ........ }
在於將組件交給Spring容器管理。組件的名稱默認是類名(首字母變小寫),也可以自己修改:
@Component:當對組件的層次難以定位的時候使用這個注解
@Controller:表示控制層的組件
@Service:表示業務邏輯層的組件
@Repository:表示數據訪問層的組件
使用的方式:
1:通過@Autowired 或者@Resource
@Controller @RequestMapping("/personInfoController") public class UserController { private static Logger logger = LoggerFactory .getLogger(UserController.class); @Resource UserManager userManager; ..... }
通過 這種方式,可以將@autowird寫到 set方法,也可以直接寫到對象聲明上。
代碼如下:
1 private JdbcTemplate jdbcTemplate 2 3 4 @Resource 5 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 6 this.jdbcTemplate = jdbcTemplate; 7 } 8 9 ......
2: 通過構造器注入
1 <bean name="springAction" class="com.dtsz.action.SpringAction"> 2 <constructor-arg index="0" ref="userDao"></constructor-arg> 3 <constructor-arg index="1" ref="userService"></constructor-arg> 4 </bean>
java代碼中使用
1 public class SpringAction { 2 //注入對象springDao 3 private UserDao userDao; 4 private UserService userService; 5 6 public SpringAction(UserDao userDao,UserService userService){ 7 this.userDao = userDao; 8 this.userService = userService; 9 } 10 11 }
第二種情況 :在ApplicationContext環境外獲取bean(比如webService,junit測試類)
1:繼承 ServletContextListener
1 public class SpringContextListener implements ServletContextListener { 2 private static Logger logger = LoggerFactory 3 .getLogger(SpringContextListener.class); 4 private static ApplicationContext springContext; 5 6 public void contextDestroyed(ServletContextEvent event) { 7 // 暫時不寫; 8 } 9 10 public void contextInitialized(ServletContextEvent event) { 11 System.out.println("####################初始化容器開始"); 12 springContext = WebApplicationContextUtils 13 .getWebApplicationContext(event.getServletContext()); 14 if (springContext == null) { 15 logger.warn("cannot find applicationContext"); 16 return; 17 } 18 19 System.out.println("####################初始化容器結束"); 20 } 21 22 public static ApplicationContext getApplicationContext() { 23 return springContext; 24 } 25 26 public static void setApplicationContext(ApplicationContext cxt) { 27 springContext = cxt; 28 } 29 30 }