一、什么是Spring
Spring框架是以简化J2EE应用程序开发为特定目标而建立的.
Spring是一个轻量级的IOC(DI)和AOP容器框架.(IOC:控制反转;DI:依赖注入;AOP:面向切面)
1、Spring模块
Application Context 上下文模块。
这个模块扩展了BeanFactory,添加了对I18N、应用生命周期事件以及验证的支持。另外,这个模块提供了很多企业级服务,如电子邮件、JNDI访问、EJB集成、远程调用以及定时服务,并且支持与模板框架(如Velocity和FreeMarker)的集成。
AOP模块
Spring对面向切面编程提供了丰富的支持。这个模块是为Spring应用开发切面的基础。与DI一样,AOP支持应用对象之间的松耦合。利用AOP,应用程序所关心的与其应用的对象关系不大。
JDBC抽象及DAO模块
Spring的JDBC和DAO模块把编写JDBC代码时的一些样板代码(获得连接、创建语句、处理结果、关闭连接)抽象出来,让数据库代码变得简单明了。
ORM映射集成模块
Spring MVC框架
Spring 的WEB模块
二、常见的注入方式
接口注入
构造方法注入
Setter方法注入
@Annotation反射注入
三、BeanFactory与ApplicationContext 的区别
BeanFactory
基础类型IoC容器,提供完整的IoC服务支持。
特点:默认采用延时初始化策略、启动速度快、资源占用少
ApplicationContext
ApplicationContext完全由BeanFactory扩展而来,增加了更多支持企业核心内容的功能。
特点:默认采用立即初始化策略、事件发布、国际化信息支持……
四、JDBC连接
applicationcontext.xml配置
<!-- 连接数据库 -->
<bean id="datasource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url"
value="jdbc:mysql://localhost/linsenhai?useUnicode=true&characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="*********"></property>
</bean>
<!-- jdbc模板,封装增删改查方法 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource"></property>
</bean>
<bean id="userdao" class="com.dao.imple.UserDaoImple">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
增删改查:
public class UserDaoImple implements UserDao {
private JdbcTemplate jdbcTemplate;
class userMap implements RowMapper<User> {
public User mapRow(ResultSet rs, int rowNums) throws SQLException {
//System.out.println(rowNums);
User user = new User();
user.setUserId(rs.getInt("user_id"));
user.setUserName(rs.getString("user_name"));
user.setUserPass(rs.getString("user_pass"));
return user;
}
}
public int addUser() {
int result = jdbcTemplate.update(
"insert into tb_user(user_name,user_pass) values(?,?)", "***",
"123456");
System.out.println(result);
return result;
}
public int delUser(int id){
int result = jdbcTemplate.update("delete from tb_user where user_id=?", id);
System.out.println(result);
return result;
}
public int updateUser(User user) {
int result = jdbcTemplate.update(
"update tb_user set user_name=? where user_id=?",
user.getUserName(), user.getUserId());
return result;
}
public List<User> getAllUser() {
List<User> users = jdbcTemplate.query("select * from tb_user",
new userMap());
return users;
}
public User getUser(int uid) {
User user = jdbcTemplate.queryForObject(
"select * from tb_user where user_id=?", new Object[] { uid },
new userMap());
return user;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
五、Spring整合struts
1、修改web.xml,在web启动的时候加载spring 容器,添加Spring 3.0 Web Libraries包。classpath的xml文件时是src下的Spring的XML配置文件,名字要相同
<!-- web启动的时候加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2、导入struts-spring-2.x.jar支持包
3、注意action需要配置成为非单例
<!-- 这里的action都是单例的,必须设置为非单例 -->
<bean id="userAction" class="com.action.UserAction" scope="prototype">
<property name="userBiz" ref="userBiz"></property>
</bean>
4、配置action时不能直接New出来
//spring整合struts,className不能直接New出来,
//而是要从spring容器中组件中取,和applicationContext.xml中的action的id一致
@Action(value = "listUsers", className = "userAction", results = { @Result(name = "success", location = "/listuser.jsp") })
public String listUsers() {
users = userBiz.getUsers();
return SUCCESS;
}
5、推荐面向接口编程
6、一般采用Spring框架的都是大型项目,需分三层:dao、biz(业务层)、action;其中action调用biz层,biz层调用dao层
六、Spring中的邮件发送
1、设置邮件发送配置文件
<!-- 邮件发送者配置 -->
<bean name="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="username" value="********@qq.com"></property>
<property name="password" value="*********"></property>
<property name="port" value="465"></property>
<property name="defaultEncoding" value="utf-8"></property>
<property name="host" value="smtp.qq.com"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.auth">true</prop>
<!-- 采用ssl 加密方式 -->
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.socketFactory.class">
javax.net.ssl.SSLSocketFactory
</prop>
</props>
</property>
</bean>
<bean id="mailAction" class="com.action.EmailAction" scope="prototype">
<property name="javaMailSender" ref="mailSender"></property>
</bean>
2、导包Spring 3.0 Misc Library、mail.jar、activation.jar,新建EmailAction
@Namespace("/")
@ParentPackage("default")
public class EmailAction extends ActionSupport{
private JavaMailSender javaMailSender;
@Action(value="send",className="mailAction",results={@Result(name="success",location="/success.jsp")})
public String send(){
//简单邮件发送
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("********@qq.com");
message.setFrom("********@qq.com");
message.setText("hello world");
message.setSubject("FirstEmail");
javaMailSender.send(message);
return SUCCESS;
}
public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
}
//支持HTML、内嵌图片、附件
MimeMessage message = javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo("********@qq.com");
helper.setFrom("*******@qq.com");
helper.setText("<html><body><h1>hello world</h1> <img src='cid:s'/></body></html>",true);
FileSystemResource res = new FileSystemResource(new File("f://s.jpg"));
helper.addInline("s", res);
FileSystemResource file = new FileSystemResource(new File("f://s.zip"));
helper.addAttachment("sfile.zip", file);
javaMailSender.send(message);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}