`
x125521853
  • 浏览: 72711 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

第五章 注释的注入

阅读更多

一:注释的方法注入

   1.XML配置文件的改动    

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">               
     <context:annotation-config/>     
</beans>

  2.依赖包的导入:

  aopalliance.jar

   asm-2.2.3.jar

   asm-commons-2.2.3.jar

   asm-util-2.2.3.jar

   aspectjlib.jar

   aspectjrt.jar

   aspectjweaver.jar

   cglib-nodep-2.1_3.jar

   commons-attributes-api.jar

   commons-attributes-compiler.jar

   commons-logging.jar

   log4j-1.2.15.jar

   persistence.jar

   spring-agent.jar

   spring-aop.jar

   spring-aspects.jar

   spring-beans.jar

   spring-context.jar

   spring-core.jar

   spring-jdbc.jar

   spring-jms.jar

   spring-orm.jar

   spring-tomcat-weaver.jar

   spring-tx.jar

 

二:@Autowired或 @Resource注释方式进行装配

    @Autowired是默认按类型装配。

    @Resource是默认按名称装配,找不到与名称匹配的bean时,再按类型装配。

 

     (1).@Resource: JDK提供,移植性强,推荐使用, 可以看到支撑类是: import javax.annotation.Resource; 只要是JDK1.5以上版本,JDK内置了此注释支撑类.

     (2).用法:

     用在属性上

     示例:

   //dao层接口: 

package com.spring.chapter5.dao;

public interface FruitDao {
	public void create();
}

   //dao层实现类  

package com.spring.chapter5.dao.impl;

import com.spring.chapter5.dao.FruitDao;

public class FruitDaoImpl implements FruitDao {
	public void create() {
		System.out.println("Dao层方法create被调用");
	}
}

   //service层接口  

package com.spring.chapter5.service;

public interface FruitService {
	public void create();
}

   //service层实现类  

package com.spring.chapter5.service.impl;

import javax.annotation.Resource;
import com.spring.chapter5.dao.FruitDao;
import com.spring.chapter5.service.FruitService;

public class FruitServiceImpl implements FruitService {
	@Resource
	private FruitDao fruitDao;

	public void create() {
		fruitDao.create();
	}

	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

   //配置文件(chapter5.xml)  

<?xml version="1.0" encoding="UTF-8"?>
<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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:annotation-config />
	<bean id="fruitDao" class="com.spring.chapter5.dao.impl.FruitDaoImpl" />
	<bean id="fruitService" class="com.spring.chapter5.service.impl.FruitServiceImpl" />
</beans>

     注意:我们只在xml中配置了两个bean对象,它们之间并没有关系,但是在Java中我们采用注释语法,这个时候@Resource注释语法会根据属性名称在spring容器中去寻找和属性名称同名id的bean对象,然后将其注入到属性中。

   //测试类  

package com.spring.chapter5.service.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter5.service.FruitService;

public class Test {
	public static void main(String[] args) {
		ApplicationContext act = new ClassPathXmlApplicationContext("chapter5.xml");
		FruitService fruitService = (FruitService) act.getBean("fruitService");
		fruitService.create();
	}
}

  (3).更改配置文件

      将<bean id="fruitDao" class="com.spring.chapter5.dao.impl.FruitDaoImpl" />改为<bean id="myFruitDao" class="com.spring.chapter5.dao.impl.FruitDaoImpl" />

      这个时候可以看到myFruitDao和属性名称并没有对应,但执行Test文件后,可以看到执行成功。这因为如果名称上没有对应,就会按类型自动对性,所以会执行成功。

 

  (4).我们还可以给@Resource加上name,请看下面的语法

   //service层实现类

public class FruitServiceImpl implements FruitService {
	@Resource(name="myFruitDao")
	private FruitDao fruitDao;

	public void create() {
		fruitDao.create();
	}

	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

   再次执行Test,同样可以执行成功.

 

   (5).用上属性的set方法上

    //service层实现类    

public class FruitServiceImpl implements FruitService {	
	private FruitDao fruitDao;

	public void create() {
		fruitDao.create();
	}

	@Resource(name="myFruitDao")
	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

   可以看到,用在属性上,或者用上属性的set方法上,效果是一模一样的,没有任何区别.

 

三:@Autowired

   //service层实现类  

public class FruitServiceImpl implements FruitService {	
	private FruitDao fruitDao;

	public void create() {
		fruitDao.create();
	}

	@Autowired
	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

   运行Test文件,可以看到效果一样

   同样,我们也可以把@Autowired改成按名称装配

   //service层实现类  

public class FruitServiceImpl implements FruitService {
	@Autowired()
	@Qualifier("myFruitDao")
	private FruitDao fruitDao;
		
	public void create() {
		fruitDao.create();
	}

	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

   这里需要注意的是:

   @Autowired()
   @Qualifier("myaFruitDao")
   private FruitDao fruitDao;
   这两句只能用在属性上,不能用上方法上.

 

   @Autowired的required属性

   @Autowired(required=true)
   @Qualifier("myFruitDao")
   required=true : 必须为属性注入值,
   required=false: 不是必须注入值,如果找不到对应的值注入,会注入null

 

四:通过在classpath自动扫描方式把组件纳入到spring容器中管理.

    Spring2.5引入了组件自动扫描机制,他可以在类路径下寻找标注了@Component, @Service, @Controller, @Repository注解的类, 并把这些类纳入进Spring容器中管理,它的作用,和在XML文件中使用Bean节点配置组件是一样的,要使用自动扫描机制。  

<?xml version="1.0" encoding="UTF-8"?>
<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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="com.spring.chapter5" />
</beans>

 

  

  

<context:component-scan base-package="com.spring.chapter5" />这一项配置了需要扫描的包,包含子包.

    @Service: 用于标注业务层的类
    @Controller: 用于标注控制层,如Action
    @Repository: 用于标注Dao层
    @Component: 用于标注组件层, 当组件不好归类的时候,可以用此标注

    通过扫描机制, 基本上可以达到配置文件基本为空的效果, 这是Spring2.5新推出的功能, 老系统不能运用, 但是新系统中, 此功能运用的非常多。

    示例:

   //dao层实现类  

package com.spring.chapter5.dao.impl;

import org.springframework.stereotype.Repository;
import com.spring.chapter5.dao.FruitDao;

@Repository
public class FruitDaoImpl implements FruitDao{	
	public void create() {
		System.out.println("Dao层方法create被调用");
	}		
}

   //service层实现类  

package com.spring.chapter5.service.impl;

import org.springframework.stereotype.Service;
import com.spring.chapter5.dao.FruitDao;
import com.spring.chapter5.service.FruitService;

@Service
public class FruitServiceImpl implements FruitService {
	private FruitDao fruitDao;
	
	public void create() {
		fruitDao.create();
	}
	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}	
}

     这个时候,我将Dao层,服务层的两个实现类交给Spring管理了,相当于以前配置了两个Bean,这个时候我们可以验证一下,我们是否可以从容器中获取对象。

   //xml配置  

<?xml version="1.0" encoding="UTF-8"?>
<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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="com.spring.chapter5" />
</beans>

   //测试类  

package com.spring.chapter5.service.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter5.dao.FruitDao;
import com.spring.chapter5.service.FruitService;

public class Test {
	public static void main(String[] args) {
		ApplicationContext acx = new ClassPathXmlApplicationContext(
				"chapter5.xml");
		FruitDao fruitDao = (FruitDao) acx.getBean("fruitDaoImpl");
		FruitService fruitService = (FruitService) acx
				.getBean("fruitServiceImpl");
		System.out.println(fruitDao);
		System.out.println(fruitService);
	}
}

     这里需要注意的是,当对象交给Spring管理后,Spring给对象起的ID名称是类的简单名称, 即类全名,但是首字母小写。

 

   自定义名称:

   //dao层实现类  

package com.spring.chapter5.dao.impl;

import org.springframework.stereotype.Repository;
import com.spring.chapter5.dao.FruitDao;

@Repository("fruitDao")
public class FruitDaoImpl implements FruitDao {
	public void create() {
		System.out.println("Dao层方法create被调用");
	}
}

   //service层实现类  

package com.spring.chapter5.service.impl;

import org.springframework.stereotype.Service;
import com.spring.chapter5.dao.FruitDao;
import com.spring.chapter5.service.FruitService;

@Service("fruitService")
public class FruitServiceImpl implements FruitService {
	
	private FruitDao fruitDao;

	public void create() {
		fruitDao.create();
	}

	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

   //测试类  

package com.spring.chapter5.service.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.chapter5.dao.FruitDao;
import com.spring.chapter5.service.FruitService;

public class Test {
	public static void main(String[] args) {
		ApplicationContext acx = new ClassPathXmlApplicationContext(
				"chapter2.xml");
		FruitDao fruitDao = (FruitDao)acx.getBean("fruitDao");
		FruitService fruitService = (FruitService) acx.getBean("fruitService");
		System.out.println(fruitDao);
		System.out.println(fruitService);
	}
}

  

五:改变对象的范围(单例或非单例)

    @Repository("fruitDao")
    @Scope("prototype")
    加上@Scope("prototype")此注释即可,这个时候每次获取对象都会是一个新对象

 

六:对象初始化方法和销毁方法的配置   

@Repository("fruitDao")
@Scope("prototype")
public class FruitDaoImpl implements FruitDao {
	public void create() {
		System.out.println("Dao层方法create被调用");
	}
	
	@PostConstruct
	public void init(){
		System.out.println("调用init");
	}
	
	@PreDestroy
	public void destory(){
		System.out.println("调用destory");
	}
}

     如果对象是非单例模式,这个时候可以看到init方法会调用两次,而destroy方法不会调用.

 

  将Dao层注入到服务层:  

@Service("fruitService")
public class FruitServiceImpl implements FruitService {
	@Resource(name="fruitDao")
	private FruitDao fruitDao;

	public void create() {
		fruitDao.create();
	}

	public void setFruitDao(FruitDao fruitDao) {
		this.fruitDao = fruitDao;
	}
}

 

分享到:
评论

相关推荐

    SQL注入攻击与防御

    第5章 SQL盲注利用 171 5.1 概述 172 5.2 寻找并确认SQL盲注 173 5.2.1 强制产生通用错误 173 5.2.2 注入带副作用的查询 173 5.2.3 拆分与平衡 173 5.2.4 常见的SQL盲注场景 175 5.2.5 SQL盲注技术 176 5.3 使用基于...

    SQL注入攻击与防御 第2版.pdf

    2. 注释注入:在输入中插入注释符号,使部分SQL语句无效,改变原有查询逻辑。 3. Error-Based注入:通过引发错误信息来获取数据库结构或数据。 4. Time-Based注入:通过延迟查询执行时间来判断数据库结构。 防御...

    SQL注入攻击与防御(安全技术经典译丛)

    第5章 SQL盲注利用  5.1 概述  5.2 寻找并确认SQL盲注  5.2.1 强制产生通用错误  5.2.2 注入带副作用的查询  5.2.3 拆分与平衡  5.2.4 常见的SQL盲注场景  5.2.5 SQL盲注技术  5.3 使用基于时间的...

    SQL注入天书 下载完整版

    如果网站正常显示第一个URL,第二个和第三个URL显示出不同结果,则可能存在SQL注入漏洞。 ##### **2. 错误消息分析** 如果Web应用程序返回详细的错误信息,攻击者可以通过这些信息来确定数据库类型以及可能存在的...

    SQL注入到脱裤

    Out-of-band注入是指攻击者利用数据库特性,使数据库服务器与第三方通信,从而获取数据。这种方式通常用于无法直接获取响应的情况。 **3. Blind注入** Blind注入也称为基于布尔的SQL注入,攻击者通过观察服务器...

    第二节 Mysql注入有关知识点-01

    攻击者可以使用内联注释来绕过WAF,例如:select * from articles where id = id使用内联注释注入:select * from articles where id = -1 /*!union*/ /*!select*/ 1,2,3,4。 Mysql注入是非常危险的攻击方式,攻击...

    sql注入的常用命令

    - `http://192.168.1.3/admin/?do=editurrency&cid=1+order+by+5+--+`:测试第五列是否存在。 - `http://192.168.1.3/admin/?do=editurrency&cid=1+order+by+6+--+`:测试第六列是否存在。 - **解释**:通过不断...

    ASP.NET中如何防范SQL注入式攻击

    5. **服务器端验证**:尽管客户端验证可以提供第一层保护,但服务器端验证是必不可少的,因为它可以防止绕过客户端验证的攻击。通过服务器端验证,确保输入数据符合预期的格式和范围。 6. **转义特殊字符**:对特殊...

    利用输入法注入DLL

    包中的第5个文件夹。 最后的最后,再介绍一个未公开函数InitializeLpkHooks,这个函数在网上能找到的资料更 少,只有一个声明而已。但是它名称中最后那个“Hooks”误导了我,我以为又是一个可以 用来注入DLL的...

    sql注入过滤字典.txt

    5. **使用ORM框架**:现代的ORM框架通常内置了安全机制来防止SQL注入。 6. **定期审计**:定期进行代码审计,检查潜在的安全漏洞。 通过以上介绍,我们可以了解到SQL注入过滤字典中包含了各种特殊字符和关键词,...

    SQL注入漏洞原理分析

    而第二个请求(`id=49 and 1=2`)中的`1=2`始终为假,如果返回结果为空,则表明存在SQL注入漏洞的可能性较大。 3. **示例分析**:假设一个站点的URL为`http://www.example.com/showdetail.asp?id=49`,其中`id`参数...

    PHP手工注入经典教程

    在注入点输入"/*",如果页面返回正常,这可能意味着数据库是MySQL,因为MySQL支持这种注释方式。接着,我们需要确定MySQL的版本。通过使用`and ord(mid(version(),1,1))&gt;51/*`,如果页面返回正常,这意味着数据库...

    第十七节 绕过剔除空格的SQL注入-01

    5. Mysql中会自动识别URL与Hex编码好的内容。 去除空格的代码分析 在Web应用中,开发者经常使用preg_replace函数来过滤用户输入的数据,例如去除空格。但是,这种做法并不能完全防止SQL注入攻击。Preg_replace函数...

    ASP手工注入!

    例如,在Access数据库中,可以利用`and`、`or`等逻辑运算符,以及单引号、注释符等特殊字符来构造有效的SQL注入语句,实现对数据库的非法访问或操作。 #### 7. 实战演练 实战演练是检验和提升手工注入技能的最佳...

Global site tag (gtag.js) - Google Analytics